給數組中的元素建立索引:
mongo中能夠單獨給數組中的元素建立索引,索引的字段名須要加上數組名,如集合inventory是這樣的:
{
_id: 1,
item: "abc",
stock: [
{ size: "S", color: "red", quantity: 25 },
{ size: "S", color: "blue", quantity: 10 },
{ size: "M", color: "blue", quantity: 50 }
]
}
{
_id: 2,
item: "def",
stock: [
{ size: "S", color: "blue", quantity: 20 },
{ size: "M", color: "blue", quantity: 25 },
{ size: "M", color: "black", quantity: 10 },
{ size: "L", color: "red", quantity: 2 }
]
}
{
_id: 3,
item: "ijk",
stock: [
{ size: "M", color: "blue", quantity: 15 },
{ size: "L", color: "blue", quantity: 100 },
{ size: "L", color: "red", quantity: 25 }
]
}
給stock數組中的size和quantity建立索引,能夠按以下語句:
db.inventory.createIndex( { "stock.size": 1, "stock.quantity": 1 } )
查詢條件爲數組中的元素:
查詢條件能夠是數組中的元素,表示只要有任意元素知足查詢條件都屬於查詢命中。若是有多個查詢條件時,並不表示數組中的某個元素要同時知足這些條件,而是將數組與逐個條件進行匹配,每一個條件都能知足便可。什麼意思呢?就是不要求知足查詢條件的元素爲同一個元素,能夠是不一樣元素知足不一樣的查詢條件。舉個例子:
db.inventory.find( { "stock.size": "S", "stock.quantity":25} )
在這個查詢條件中,數組中只要有元素知足size=="S",有元素知足quantity == 25便可,不要求有元素同時知足這兩個條件,因此上面的集合中,第1,2條記錄都能命中查詢條件。
若是咱們想要查詢有元素同時命中這兩個條件怎麼辦呢?這時須要使用$elemMatch操做符:
db.inventory.find( { "stock": { $elemMatch: { size: "S", quantity: 25 } } } )
這樣就只會命中第一條記錄了,由於只有第一條記錄中的stock數組中有元素同時知足{ size: "S", quantity: 25 }這個條件。
給數組中添加元素:
例如,咱們有集合以下:
{
"_id" : 5,
"quizzes" : [
{ "wk": 1, "score" : 10 },
{ "wk": 2, "score" : 8 },
{ "wk": 3, "score" : 5 },
{ "wk": 4, "score" : 6 }
]
}
往數組中添加元素使用$push操做符,此操做有幾個參數:
$each:一次性添加多個元素時使用,要添加多個元素,則$push的參數是一個數組,這時$push會將此數組當成一個對象添加到原數組的末尾,必須加上$each來表示將數組中的每一個元素添加到原數組的末尾。
$slice:表示添加完後只保留指定數量的元素,其餘元素丟棄。
$sort:表示添加完後將整個數組按指定字段排序保存。
例:
db.students.update(
{ _id: 5 },
{
$push: {
quizzes: {
$each: [ { wk: 5, score: 8 }, { wk: 6, score: 7 }, { wk: 7, score: 6 } ],
$sort: { score: -1 },
$slice: 3
}
}
}
)
上面的語句表示往數組中添加三個元素,並按score降序排序,最後只保留3個元素,因此最終結果以下:
{
"_id" : 5,
"quizzes" : [
{ "wk" : 1, "score" : 10 },
{ "wk" : 2, "score" : 8 },
{ "wk" : 5, "score" : 8 }
]
}
排序字段爲數組中文檔的某個字段:
當排序字段爲數組中內嵌文檔的字段時,若是是按小於進行比較或者按升序排序,則會取每一個數組中最小的元素進行比較,反之則取最大的元素進行比較。
參數資料:
https://docs.mongodb.com/manual/core/index-multikey/#multikey-embedded-documents
https://docs.mongodb.com/manual/tutorial/query-array-of-documents/html
https://docs.mongodb.com/manual/reference/operator/update/push/index.htmlmongodb
https://docs.mongodb.com/manual/reference/bson-type-comparison-order/#bson-types-comparison-order數組