Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 为什么MongoDB$size为空子数组返回1?_Arrays_Mongodb - Fatal编程技术网

Arrays 为什么MongoDB$size为空子数组返回1?

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

给定以下结构中的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_系统转发了多少条消息。我从这个开始:

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