MongoDB聚合匹配非空数组

MongoDB aggregate match non-empty array

我在 MongoDB 中有一个集合,其中包含一个字段“events”,它是一个数组。我需要为此编写一个聚合查询来检查事件数组是否为空,但找不到执行此操作的方法。

我想要这样的东西:

db.collection.aggregate([
    { 
        $match: { 
            events: {
                "$empty": false 
            }
        }
    }
]);

经过一番挖掘并尝试了几个选项(包括 $gte 的讨厌项目: $size 的 0 后跟该投影字段上的匹配项)我最终发现以下内容有意义并且确实有效:

db.collection.aggregate([
    { 
        $match: { 
            "events.0": {
                "$exists": true 
            }
        }
    }
]);

查询

  • 匹配以测试 not-equal 是否与空数组
    (据我所知,$size 成本为 O(n),所以检查这个的方法很糟糕)

Test code here

*这个查询看起来很直接(你的看起来更棘手),但我不知道哪个更快,如果你对它进行基准测试或者任何人知道如果可以的话添加评论

aggregate([{"$match":{"$expr":{"$ne":["$events", []]}}}])

如果你想传递文档,如果是其他类型的数组,你可以这样做。

aggregate(
[{"$match":
  {"$expr":
   {"$cond":
    [{"$isArray":["$events"]}, {"$ne":["$events", []]}, true]}}}]
)

如果您只想执行此操作并且可能更快,那么您的解决方案很好,但如果您需要一种聚合方式来执行此操作,则可以使用它。 例如检查 $match.

之外是否为空