mongodb数组查询 - mongodb 内嵌数组查询问题: 如何限定返回与条件匹配的数组

浏览:16日期:2023-07-04

问题描述

mongodb数组查询 - mongodb 内嵌数组查询问题: 如何限定返回与条件匹配的数组

原数据为:

{ '_id' : NumberLong(1181675746), 'shard_qty' : 4, 'goods_qty' : 0, 'shop_qty' : 0, 'favorite_qty' : 4, 'favorite_shards' : [ { 'sid' : NumberLong(580), 'favorite_dt' : ISODate('2015-06-26T12:13:06.405+08:00'), 'is_attention' : true}, { 'sid' : NumberLong(579), 'favorite_dt' : ISODate('2015-06-26T12:13:06.405+08:00'), 'is_attention' : true}, { 'sid' : NumberLong(578), 'favorite_dt' : ISODate('2015-06-26T12:13:06.405+08:00'), 'is_attention' : true}, { 'sid' : NumberLong(577), 'favorite_dt' : ISODate('2015-06-26T13:20:48.449+08:00'), 'is_attention' : true} ]}

查询条件为

db.getCollection(’web_mem_favorites’).findOne( { ’_id’:NumberLong(1181675746), ’favorite_shards.sid’: {’$in’:[NumberLong(577),NumberLong(578)]} } ,{'favorite_shards':1})

想返回的数据:

{ '_id' : NumberLong(1181675746), 'favorite_shards' : [ { 'sid' : NumberLong(578), 'favorite_dt' : ISODate('2015-06-26T12:13:06.405+08:00'), 'is_attention' : true}, { 'sid' : NumberLong(577), 'favorite_dt' : ISODate('2015-06-26T13:20:48.449+08:00'), 'is_attention' : true} ]}

问题解答

回答1:

这个简单,使用下面的语句就可以仅返回当前匹配的数组:

db.getCollection(’web_mem_favorites’).find({'_id':NumberLong(1181675746),'favorite_shards.sid':NumberLong(577)},{'favorite_shards.$':1}).pretty()回答2:

javascriptdb.getCollection(’web_mem_favorites’).find( {’_id’:NumberLong(1181675746)},favorite_shards.sid’: {’$in’:[NumberLong(577)]}} {'_id' : 1, 'favorite_shards': '$slice[2,1]' })

favorite_shards数组在返回时,只返回第二个数组元素。不过这个得提前知道sid:577是第几个元素。在mongodb的数组查询手册中,并没有发现能返回满足自定义条件的数组单元的方法,可以尝试用程序在返回的结果集上再过滤下favorites_shards数据。

回答3:

findOne( {’_id’:NumberLong(1181675746),’favorite_shards.sid’: {’$in’:[NumberLong(577)]}} ,{'favorite_shards.$':1, '_id': 0} )

懂题主意思了,下面是修改后的代码

db.test.aggregate({'$unwind':'$favorite_shards'}, {'$match':{'favorite_shards.sid': {'$in': [NumberLong(578), NumberLong(577)]}}}, {'$group': {'_id': '$_id', 'favorite_shards':{’$push’: '$favorite_shards'}}})

结果:{ '_id' : NumberLong(1181675746), 'favorite_shards' : [ { 'sid' : NumberLong(578), 'favorite_dt' : ISODate('2015-06-26T04mongodb数组查询 - mongodb 内嵌数组查询问题: 如何限定返回与条件匹配的数组06.405Z'), 'is_attention' : true }, { 'sid' : NumberLong(577), 'favorite_dt' : ISODate('2015-06-26T05mongodb数组查询 - mongodb 内嵌数组查询问题: 如何限定返回与条件匹配的数组48.449Z'), 'is_attention' : true } ] }

回答4:

可以用projection操作符$elemMatch:

javascriptdb.test.find({’favorite_shards.sid’: 577}, {favorite_shards:{$elemMatch:{sid:577 } } }).pretty(){ '_id' : NumberLong(1181675746), 'favorite_shards' : [{ 'sid' : NumberLong(577), 'favorite_dt' : ISODate('2015-06-26T05:20:48.449Z'), 'is_attention' : true} ]}

$elemMatch的局限性是只能返回数组中的第一个匹配记录。

回答5:

我想问一下这个是什么软件?

回答6:

可以使用$unwind查询,也会返回多个满足查询条件的子文档。

db.web_mem_favorites.aggregate( {'$project':{'favorite_shards':'$favorite_shards'}}, {'$unwind':'$favorite_shards'}, {'$match':{'favorite_shards.sid': NumberLong(577)}})

相关文章: