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),所以检查这个的方法很糟糕)
*这个查询看起来很直接(你的看起来更棘手),但我不知道哪个更快,如果你对它进行基准测试或者任何人知道如果可以的话添加评论
aggregate([{"$match":{"$expr":{"$ne":["$events", []]}}}])
如果你想传递文档,如果是其他类型的数组,你可以这样做。
aggregate(
[{"$match":
{"$expr":
{"$cond":
[{"$isArray":["$events"]}, {"$ne":["$events", []]}, true]}}}]
)
如果您只想执行此操作并且可能更快,那么您的解决方案很好,但如果您需要一种聚合方式来执行此操作,则可以使用它。
例如检查 $match
.
之外是否为空
我在 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),所以检查这个的方法很糟糕)
*这个查询看起来很直接(你的看起来更棘手),但我不知道哪个更快,如果你对它进行基准测试或者任何人知道如果可以的话添加评论
aggregate([{"$match":{"$expr":{"$ne":["$events", []]}}}])
如果你想传递文档,如果是其他类型的数组,你可以这样做。
aggregate(
[{"$match":
{"$expr":
{"$cond":
[{"$isArray":["$events"]}, {"$ne":["$events", []]}, true]}}}]
)
如果您只想执行此操作并且可能更快,那么您的解决方案很好,但如果您需要一种聚合方式来执行此操作,则可以使用它。
例如检查 $match
.