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

}

]

}

回答:

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

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

回答:

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数据。

回答:

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-26T041306.405Z"), "is_attention" : true }, { "sid" : NumberLong(577), "favorite_dt" : ISODate("2015-06-26T052048.449Z"), "is_attention" : true } ] }

回答:

可以用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的局限性是只能返回数组中的第一个匹配记录。

回答:

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

db.web_mem_favorites.aggregate(

{"$project":{"favorite_shards":"$favorite_shards"}},

{"$unwind":"$favorite_shards"},

{"$match":{"favorite_shards.sid": NumberLong(577)}}

)

回答:

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

回答:

你好,楼主,能把正确的java语法 贴一下出来吗

以上是 mongodb 内嵌数组查询问题: 如何限定返回与条件匹配的数组 的全部内容, 来源链接: utcz.com/p/196023.html

回到顶部