MongoDB筛选嵌套对象中的数组元素

3

我有一个文件如下:

{
    "_id" : ObjectId("56423b2558cb340599108b35"),
    "test" : {
        "source" : [
            {
                "member" : "abc"
            },
            {
                "member" : "xyz"
            }
        ]
    }
}

我想在数组元素xyz上进行过滤,我正在尝试以下查询:
db.coll.find({ "test.source.member" : "xyz" }, { "test.source.$.member" : true }).pretty()
显然,在2.4版本中它可以工作,在2.6版本中它不起作用。
在2.4版本中,它返回了“xyz”,而在2.6版本中,它返回了“abc”,即第一个元素。有没有办法过滤“abc”,因为最终我想要更新。顺便说一句,我也尝试过$elemMatch,它似乎给出了相同的输出“abc”。
谢谢。

发布的“代码”绝对不是C语言,所以请移除“c”标签。 - user3629249
1个回答

5
根据文档,如果您使用的是2.6版本,则以下内容应该会给出正确的输出:
db.coll.find({ "test.source.member" : "xyz"}, { "test.source.$" : 1}).pretty()

您可以通过以下方法提取成员:
var member = db.coll.find(
                 { "test.source.member" : "xyz"},
                 { "test.source.$" : 1}
                 ).test.source[0].member;

成员变量的值将是:
xyz

和之前一样,它没有显示正确过滤的项目。 - user2766839
2
@user2766839 当你在Mongo shell中运行db.version()时,它会输出什么内容? - Abdullah Rasheed
1
@inspired,应该是 { "test.source.$" : 1 } 而不是 { "test.source.$.member" : 1 } 才能只获取具有成员 "xyz" 的源数组中的第一个元素。如果不是,请解释一下为什么。谢谢。 - Lisa Gagarina
2
我尝试插入一个新的查询,然后过滤功能就正常工作了。但是在升级之后,其他记录中的过滤似乎不起作用。目前正在调查这个问题。 - user2766839
@LisaGagarina,你是对的test.source.$是正确的,但是当我测试test.source.$.member时没有出现错误。谢谢,我会更新它。 - Abdullah Rasheed
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接