首页 > 解决方案 > 查询节点的所有后代

问题描述

给定一组具有如下属性“myContacts”的 MongoDb 文档:

  {
       "_id": 123,
       "myContacts" : {            
            "contacts" : {
                "10" : {
                    "_id" : NumberLong(10),
                    "name" : "c1",
                    "prop" : true
                },
                "20" : {
                    "_id" : NumberLong(20),
                    "name" : "c2"
                },
            }
        }
}

我想选择所有文档,其中至少一个联系人缺少“prop”字段。我想出了一个通用查询:

db.getCollection('xyz').find({ 'myContacts.contacts.???.prop': { $exists: false } })

问题是联系人的 ID 是路径的一部分,我无法提前知道它们。我想要 sth like 'myContacts.contacts.$anyChild.prop',但在 mongo 文档中找不到类似的东西。

这是否意味着没有办法做到这一点?

PS:我无法更改文档结构,实时应用程序使用它。我在谷歌上花了一些时间,我敢打赌这是不可能的。但是,我希望有使用 Mongo 经验的人发表意见。

标签: mongodb

解决方案


谢谢大家的有用评论,这让我走了!我可以得到我想要的结果:

db.getCollection('xyz').aggregate([{$project: {_id:1, contacts:{$objectToArray: "$myContacts.contacts"}}}, {$match: {"contacts.v.prop" : null}}])

推荐阅读