Arrays 为什么MongoDB$size为空子数组返回1?
给定以下结构中的MongoDB集合Arrays 为什么MongoDB$size为空子数组返回1?,arrays,mongodb,Arrays,Mongodb,给定以下结构中的MongoDB集合 { "_id" : 1, "system_id" : "123", "sub_systems" : [ { "sub_system_id" : "456", "status" : "connected", "messages_relayed" : [ ] // An array of message_ids that have been relayed } ]} 我想创建一个查询,返回每个sub
{
"_id" : 1,
"system_id" : "123",
"sub_systems" : [
{
"sub_system_id" : "456",
"status" : "connected",
"messages_relayed" : [ ] // An array of message_ids that have been relayed
}
]}
我想创建一个查询,返回每个sub_系统转发了多少条消息。我从这个开始:
db.messages.aggregate([{
"$project": {
"_id": 0,
"num_of_msgs_relayed": {
"$cond":
{"if": { "$isArray": "$sub_systems.messages_relayed" },
"then": { "$size": "$sub_systems.messages_relayed" },
"else": 0}
}}}]);
令我惊讶的是,结果是:
{“转发的msgs数量”:1}
问题:我希望查询返回0值,因为我基本上是在投影空数组的$size!这1背后的原因是什么
注意:以下命令可用于创建messages collection上显示的数据:
db.runCommand({
插入:“信息”,
文档:[{“id”:1,“系统id”:“123”,“子系统”:[{“状态”:“已连接”,“消息转发”:[]}]}
)
您可以尝试下面最简单的查询,观察MongoDB如何解释
子系统
db.messages.aggregate([
{ "$project": { "arr": "$sub_systems.messages_relayed"}}
]);
因此,此查询将返回一个数组数组,因为子系统
是一个外部数组,而消息_中继
是另一个数组。这就是为什么您得到的是1
而不是0
要“投影空数组的大小”,您应该在项目之前和项目下方使用聚合将返回0
,而不是1
db.messages.aggregate([
{ $unwind: "$sub_systems" },
{
$project: {
_id: 0,
num_of_msgs_relayed: {
$cond: {
if: { $isArray: "$sub_systems.messages_relayed" },
then: { $size: "$sub_systems.messages_relayed" },
else: 0
}
}
}
}
])
$unwind
然后使用$sum
进行$group
。