在mongodb数据库中,如何查找()并过滤掉所有子文档?

时间:2018-02-07 21:59:36

标签: mongodb nosql mongodb-query

如果我有一个mongodb数据库,是否可以:

db.mydb.find(...)

这样结果会过滤掉任何可能存在的子文档,而不知道它们是什么?

例如,如果我有:

{ "_id" : ObjectId("..."), "name" : "george", "address" : { "street" : "101 example way", "city" : "tutorial", "state" : "CA" }, "other thing" : "thing value" }

我可以传递给find()的哪些参数会导致获得:

{ "_id" : ObjectId("..."), "name" : "george", "other thing" : "thing value" }

没有必须指定:

db.mydbl.find( {}, { "address" : 0} )

是否存在禁止所有子文档的方法?

1 个答案:

答案 0 :(得分:1)

如果要在不指定任何现有密钥的情况下动态删除任何嵌套对象,可以使用聚合框架实现:

db.col.aggregate([
    {
        $project: {
            keysAndValues: {
                $objectToArray: "$$ROOT"
            }
        }
    },
    {
        $addFields: {
            keysAndValues: {
              $filter: {
                 input: "$keysAndValues",
                 as: "kvPair",
                 cond: { $ne: [ { $type: "$$kvPair.v" }, "object" ] }
              }
            }
        }
    },
    {
        $replaceRoot: {
            newRoot: { $arrayToObject: "$keysAndValues" }
        }
    }
])

基本上这个想法非常简单:我们希望使用($objectToArray)将文档转换为键值对列表。然后,我们可以过滤掉值为$type "object"的键值对。在最后一步中,我们可以使用$arrayToObject

将数组转换回对象