编辑 - 请参阅问题的最后一种方法:
我有一个mongo对象,其属性如:
{ something: { name: "asdf", childThing: {} } }
和
{ something: { name: "jklh", childThing: {"type": "blah"} } }
如何基于somethingElse
count(somethingElse.childThing.keys) > 0
的查询
我试过这个但是它只适用于数组,我想,因为它会返回所有记录:
{ 'childThing': { $exists: true, $not: {$size: 0} } }
编辑:我想出了一种方法:
{ 'something.childThing': { $not: {$eq: {} } } }
这只匹配该子项具有非空值的所有文档
答案 0 :(得分:1)
您可以使用$objectToArray
运算符将childThing
对象转换为数组:
将文档转换为数组。返回数组包含一个元素 对于原始文档中的每个字段/值对。
这样你可以得到它的大小(字段数)并将其匹配为不是0:
db.collection.aggregate([
{ $addFields: {
"childKeyCount": { "$size": { "$objectToArray": "$something.childThing" } }
}},
{ $match: { "childKeyCount": { "$ne": 0 } } }
// { $project: { "childKeyCount": false } }
])
鉴于此输入:
[
{ "something" : { "name" : "asdf", "childThing" : { } } }
{ "something" : { "name" : "jklh", "childThing" : { "type" : "blah" } } }
]
它给出了:
[
{
"something" : { "name" : "jklh", "childThing" : { "type" : "blah" } },
"childKeyCount" : 1
}
]
答案 1 :(得分:1)
在find()
查询中使用 $expr
运算符,因为它允许在查询语言中使用聚合表达式。您需要一个表达式,使用 $objectToArray
将具有未知键的对象转换为数组,并使用 $size
计算数组的大小检查对象中的键数。获得大小后,请使用 $gt
进行比较检查,以用作 $expr
的条件:
db.getCollection('collectionName').find({
"$expr": {
"$gt": [ { "$size": { "$objectToArray": "$something.childThing" } }, 0]
}
})