【问题标题】:MongoDB filter array element in a nested object嵌套对象中的 MongoDB 过滤器数组元素
【发布时间】:2015-11-10 19:20:25
【问题描述】:

我有一份文件如下:

{
    "_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”。

谢谢。

【问题讨论】:

  • 贴出来的'code'肯定不是C,所以请去掉'c'标签

标签: mongodb


【解决方案1】:

根据Docs,如果您运行的是 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 当你运行 db.version() 它在 mongo shell 中输出什么?
  • @inspired,不应该是 { "test.source.$" : 1 } 而不是 { "test.source.$.member" : 1 } 以便只获取第一个元素来自具有成员“xyz”的源数组?如果不是,你能解释一下为什么吗?谢谢。
  • 我尝试插入一个新的查询,然后过滤工作。但是,升级后过滤似乎不适用于其他记录。目前正在调查。
  • @LisaGagarina,你是对的 test.source.$ 是正确的,但是当我测试 test.source.$.member 时我没有收到错误。谢谢,我会更新的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 2019-12-18
  • 2018-03-05
  • 2017-05-18
  • 1970-01-01
  • 2022-12-18
  • 2018-08-08
相关资源
最近更新 更多