如果我有一个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} )
是否存在禁止所有子文档的方法?
答案 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