提问者:小点点

Mongo查找子文档数组中任何可能字段是否有值


我正在对集合运行聚合并使用对另一个子集合的查找。

每个子级可能有也可能没有包含字符串的字段(foo)。

如果这些字段中至少有1个对任何子子文档具有字符串,我将项目一个布尔

这样我就可以

db.Parent.aggregate([
  {
    '$lookup': {
      'from': 'Children', 
      'localField': '_id', 
      'foreignField': 'parentId', 
      'as': 'CHILDREN'
    }
  }, {
     childHasFoo: {
         "$CHILDREN" : {$elemMatch: {foo: {$ne: ''}}}
     }
}
]

您可以看到我对childhasfoo的投影。我想我可以使用$ElemMatch$AnyElementTrue。请记住,foo也可能不存在于/所有子子文档上。因此需要考虑到这一点。

谢谢!


共1个答案

匿名用户

  • 使用$MAP数组运算符迭代数组的循环,
  • 使用$ne检查条件,这将返回布尔值
  • $AnyElementTrue要检查的元素是否为true
  {
    $addFields: {
      childHasFoo: {
        $anyElementTrue: {
          $map: {
            input: "$CHILDREN",
            in: { $ne: ["$$this.foo", ""] }
          }
        }
      }
    }
  }

第二种选择是更精确的条件,

  • $trim删除字符串中的空白
  • $not$in要检查的字符串是否为空“”或null然后为false,否则为true
  {
    $addFields: {
      childHasFoo: {
        $anyElementTrue: {
          $map: {
            input: "$CHILDREN",
            in: {
              $not: {
                $in: [
                  { $trim: { input: "$$this.foo" } },
                  ["", null]
                ]
              }
            }
          }
        }
      }
    }
  }