从对象拉取值 - >数组 - >对象 - >对象mongo

时间:2015-10-24 18:38:36

标签: mongodb

我有以下结构

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

        }
      }
    ]
  }
}

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

注意db1内可能多次存在属性b2,在这种情况下,我想将其全部删除对象

我试过

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

但它没有返回任何东西,虽然有记录,任何帮助赞赏。

我也希望从记录中提取数据。

感谢。

更新

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

这对我有用,但仍然不知道如何使用位置运算符从记录中提取值

1 个答案:

答案 0 :(得分:0)

请花一点时间来形成您的问题 ,以便更轻松地回答:您的示例数据在列表中包含键值(无效),你的问题提到$ 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"
}

更新:添加详细信息以回应评论。

如果要删除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();