嵌套对象具有的mongodb查询> 0属性

时间:2018-03-10 19:26:45

标签: mongodb mongodb-query

编辑 - 请参阅问题的最后一种方法:

我有一个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: {} } } }

这只匹配该子项具有非空值的所有文档

2 个答案:

答案 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]
    }
})