mongodb中的数组

给数组中的元素创建索引:
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

转载于:https://my.oschina.net/u/150599/blog/3026677

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值