gpt4 book ai didi

mongodb $聚合空数组和多个文档

转载 作者:可可西里 更新时间:2023-11-01 09:08:18 27 4
gpt4 key购买 nike

mongodb 有以下文档:

> db.test.find({name:{$in:["abc","abc2"]}})
{ "_id" : 1, "name" : "abc", "scores" : [ ] }
{ "_id" : 2, "name" : "abc2", "scores" : [ 10, 20 ] }

我想获取每个文档的分数数组长度,我应该怎么做?

尝试以下命令:

db.test.aggregate({$match:{name:"abc2"}}, {$unwind: "$scores"}, {$group: {_id:null, count:{$sum:1}}} )

结果:

{ "_id" : null, "count" : 2 }

但是下面的命令:

db.test.aggregate({$match:{name:"abc"}}, {$unwind: "$scores"}, {$group: {_id:null, count:{$sum:1}}} )

什么都不返回。问题:

  1. 我应该如何在 2 个或更多文档中获得每个分数的长度命令?
  2. 为什么第二个命令的结果没有返回?如何我应该检查数组是否为空吗?

最佳答案

所以这其实是一个普遍的问题。 $unwind 的结果数组为“空”的聚合管道中的阶段是从管道结果中“移除”文档。

为了为这样一个“空”数组返回“0”的计数,您需要执行如下操作。

在 MongoDB 2.6 或更高版本中,只需使用 $size :

db.test.aggregate([
{ "$match": { "name": "abc" } },
{ "$group": {
"_id": null,
"count": { "$sum": { "$size": "$scores" } }
}}
])

在早期版本中你需要这样做:

db.test.aggregate([
{ "$match": { "name": "abc" } },
{ "$project": {
"name": 1,
"scores": {
"$cond": [
{ "$eq": [ "$scores", [] ] },
{ "$const": [false] },
"$scores"
]
}
}},
{ "$unwind": "$scores" },
{ "$group": {
"_id": null,
"count": { "$sum": {
"$cond": [
"$scores",
1,
0
]
}}
}}
])

现代操作很简单,因为 $size 只会“测量”数组。在后一种情况下,您需要在数组为空时用单个 false 值“替换”该数组,以避免 $unwind 为“空”语句“破坏”它。

因此替换为 false 允许 $cond "trinary"选择是否将 10 添加到 $sum总体声明。

这就是你如何获得“空数组”的长度。

关于mongodb $聚合空数组和多个文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29163489/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com