从对象 -> 数组 -> 对象 -> 对象 MONGO 中提取值



我有下面这个结构

{
  _id: ".....",
  a: {
    a1:".......",
    b: [
      b1: {
        b11: "......",
        b12: "......",
      },
      b2: {
        b21: "......",
        b22: "......",
        d: {},
      },
      c:{
        c1: {
          ......
        },
        d: {
        }
      }
    ]
  }
}

这里我想检查属性d是否存在于b中,它可能存在于b中的多个对象中,如果存在则从记录中拉出d对象。

注意:在b1b2中可能有一个属性d存在多次的机会,在这种情况下,我想从所有对象中删除它

I tried like

Coll.find({ 'a.b': { $elemMatch: { 'c': { d: { $exists: true } } } } })

但是没有返回任何东西,虽然有记录,感谢任何帮助。

我也想从记录中提取数据。

谢谢。

Coll.find({ 'a.b.c.d'{ $exists: true } })

为我工作,但仍然不知道如何使用位置运算符从记录

拉值

请多花一点时间形成你的问题使它们更容易回答:你的示例数据在列表(无效)内具有键值,你的问题提到$elemMatch这是一个列表操作符,你谈论删除东西,但从不跟进这个想法,然后你的UPDATE切换齿轮并暗示它是一个对象层次。

从您的UPDATE得到提示,我创建了一些有效的数据-将其粘贴到mongo shell中(可能在测试数据库中):

db.test.insert({
  a: {
    a1: "a1",
    b: {
      b1: {
        b11: "b11",
        b12: "b12",
      },
      b2: {
        b21: "b21",
        b22: "b22",
        d: {},
      },
      c: {
        c1: {
          c1: "......"
        },
        d: {
          d1: "woo hoo, struck gold"
        }
      }
    }
  }
})

在mongo shell中,一切都是javascript,所以"位置操作符"是点和数组下标操作符。mongo find()返回一个文档数组。如果您想从查询

返回的第一个文档中获取d文档(对象)
db.test.find({'a.b.c.d': {$exists: true}})[0].a.b.c.d

生产

{
  "d1": "woo hoo, struck gold"
}

UPDATE:在回应评论时添加细节。

如果要删除a.b.c.d子文档,请使用$unset

// remove sub-document a.b.c.d
db.test.update({}, {$unset: {'a.b.c.d': ''}});
// look at the document to verify that a.b.c.d is removed
db.test.find();

最新更新