標籤:mongodb 查詢 數組
查詢操作基本查詢查詢指定集合中的所有記錄db.testData.find()或者db.testData.find({});
相等條件查詢db.testData.find({num:5});//查詢num=5的記錄
使用查詢操作符聲明多個條件db.testData.find({num:{$in:[2,3,4]}});查詢num為2,3,4的記錄。
儘管可以使用$or操作符來執行同樣的查詢,但是當多個or條件都是在同一欄位上的相等判斷時,請使用$in而不是$or。
and條件查詢db.testData.find({name:‘d‘,num:{$lt:10}});//查詢name為d且num小於10的記錄。lt = less than
or條件查詢db.find({$or:[{name:‘a‘},{num:{$gt:3}}])//查詢name為a或者num大於3的記錄。gt = greater than
and or 混合查詢
db.testData.find({gender:‘male‘,$or:[{name:‘a‘},{age:{$gt:3}}]});//查詢gender為male,且(名字為a或者age>3)的記錄。
嵌入型記錄查詢當一個欄位內嵌了一條記錄,查詢時既可以聲明精確的(即欄位順序,欄位值都匹配)去匹配內嵌記錄某些欄位,或者使用“.”來匹配內嵌記錄的各個欄位聲明。
測試資料db.testData.insert( { producer:{company:‘a‘,address:‘123‘},name:‘aaa‘ } );
db.testData.insert( { producer:{company:‘a‘,address:‘123‘} } );
精確匹配內嵌記錄的某欄位原來的db.testData.find(<field>:<value>)中,將<value>改為匹配的內嵌記錄即可
例:db.testData.find( { producer:{company:‘a‘,address:‘123‘} } );
結果將返回以上兩條測試資料
注意:
db.testData.find( { producer:{address:‘123‘,company:‘a‘} } )
db.testData.find( { producer:{address:‘123‘,name:‘aaa‘} } )
db.testData.find( { producer:{company:‘a‘,name:‘aaa‘} } )
這三條語句都不會查詢到結果,即這種查詢方式必須從是從第一到第n個欄位的匹配,欄位順序顛倒,或者不是挨著的都不會查到結果。
匹配某些內嵌欄位db.testData.find( { ‘producer.company‘:‘a‘ } );
db.testData.find( { ‘producer.company‘:‘a‘,‘producer.address‘:‘123‘ } );
以上兩條可以查詢到所有測試資料。
注意:
db.testData.find( { ‘producer.company‘:‘a‘,‘producer.name‘:‘aaa‘ } );
db.testData.find( { ‘producer.address‘:‘123‘,‘producer.name‘:‘aaa‘ } );
db.testData.find( { ‘producer.name‘:‘aaa‘ } );
這三條語句也無法查詢到測試資料,也就是說這種方式也必須是從第一到第n個欄位的匹配,欄位順序,或者不是挨著的欄位都不會查到結果
數組概述當某個欄位儲存數組,可以根據數組中的某個值來查詢這條記錄。如果這個數組儲存著嵌入型記錄,可以使用“.”查詢。
如果使用$elemMatch聲明多個條件來進行查詢,數組必須至少包含一條記錄滿足所有條件。
如果沒有使用$elemMatch來聲明多個條件進行查詢,那麼滿足條件的記錄符合的條件是:這個數組中的各個元素能夠覆蓋條件的每個要求,如數組5,6,7,條件為=5且=7的情況下,數組中的5和7兩個元素組合起來能夠覆蓋所有條件要求。
測試資料db.testData.insert({ _id: 5, type: "food", item: "aaa", ratings: [ 5, 8, 9 ] });
db.testData.insert({ _id: 6, type: "food", item: "bbb", ratings: [ 5, 9 ] });
db.testData.insert({ _id: 7, type: "food", item: "ccc", ratings: [ 9, 5, 8 ] });
精確匹配數組查詢結果需要精確匹配數組中的每個值,包括每個元素的順序db.testData.find( { ratings: [ 5, 8, 9 ] } )
匹配數組中的一個值db.testData.find( { ratings: 5 } )
匹配數組指定位置的值db.testData.find( { ‘ratings.0‘: 5 } )//匹配ratings數組中第一個元素為5的記錄
數組的多條件查詢單元素條件查詢db.testData.find( { ratings: { $elemMatch: { $gt: 5, $lt: 9 } } } )//匹配ratings數組中至少有一個元素既大於5又小於9的記錄。
多元素聯合匹配查詢db.testData.find( { ratings: { $gt: 5, $lt: 9 } } )//匹配數組中有一個元素大於5,同時有另一個元素小於9的記錄,或者某個元素同時滿足這兩個條件的記錄。
嵌入型記錄數組測試資料{
_id: 100,
type: "food",
item: "xyz",
qty: 25,
3.3. MongoDB CRUD Tutorials 91
MongoDB Documentation, Release 2.6.4
price: 2.5,
ratings: [ 5, 8, 9 ],
memos: [ { memo: "on time", by: "shipping" }, { memo: "approved", by: "billing" } ]
}
{
_id: 101,
type: "fruit",
item: "jkl",
qty: 10,
price: 4.25,
ratings: [ 5, 9 ],
memos: [ { memo: "on time", by: "payment" }, { memo: "delayed", by: "shipping" } ]
}
使用數組下標匹配嵌入型記錄的某個欄位如果你知道嵌入型記錄的數組順序,可以用以下查詢
db.testData.find( { ‘memos.0.by‘: ‘shipping‘ } )//匹配memos數組中第一元素的by欄位為shipping的記錄
無需數組下標匹配欄位不知道數組順序的情況下,用以下查詢
db.testData.find( { ‘memos.by‘: ‘shipping‘ } )//匹配memos數組中某個元素包含by欄位且值為shipping的記錄
數組的多條件查詢和數組查詢一樣,使用$elemMatch就是要數組中的某個元素滿足所有條件,不用的話就是多個元素組合起來滿足所有條件
單元素條件查詢使用$elemMatch來查詢數組中某個元素滿足所有的記錄
db.testData.find(
{
memos:
{
$elemMatch:
{
memo: ‘on time‘,
by: ‘shipping‘
}
}
}
)//匹配memos中某個元素既有memo為‘on time‘又有by為 ‘shipping‘的記錄
組合滿足條件查詢db.inventory.find(
{
‘memos.memo‘: ‘on time‘,
‘memos.by‘: ‘shipping‘
}
)//匹配memos數組中某個元素包含memo欄位且值為on time,同時另一個元素包含by欄位且值為shipping的記錄,或者某個元素同時滿足兩條記錄
MongoDB 操作手冊CRUD查詢