【问题标题】:In a mongodb database, how do I find() and filter out any subdocuments?在 mongodb 数据库中,如何查找()并过滤掉任何子文档?
【发布时间】:2018-02-07 21:59:35
【问题描述】:

如果我有一个 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} )

是否存在抑制所有子文档的方法?

【问题讨论】:

    标签: mongodb nosql mongodb-query


    【解决方案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 将数组转换回对象

    【讨论】:

    • 谢谢!我正在查看 objectToArray 运算符,但我似乎无法让它工作。我正在使用 objectToArray 文档页面上的示例,但直接复制并粘贴清单示例以进行测试,我得到 "errmsg" : "exception: invalid operator '$objectToArray'" 对可能导致此问题的任何想法?
    • 它是在 v 3.6 中引入的,所以我认为如果可能的话你需要升级你的数据库服务器。恐怕这是动态读取键和值的唯一方法
    • 就是这样!非常感谢!
    猜你喜欢
    • 2016-08-29
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2021-03-23
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多