给数组中的元素创建索引:
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/
https://docs.mongodb.com/manual/reference/operator/update/push/index.html
https://docs.mongodb.com/manual/reference/bson-type-comparison-order/#bson-types-comparison-order