【问题标题】:Why does MongoDB $size returns 1 for an empty sub-array?为什么 MongoDB $size 为空子数组返回 1?
【发布时间】:2019-02-13 20:28:49
【问题描述】:

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

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}
            }}}]);

令我惊讶的是,结果是:

{ "num_of_msgs_relayed" : 1 }

QUESTION:我希望查询返回 0 值,因为基本上我投影的是空数组的 $size!这 1 背后的原因是什么?

P.S.:以下命令可用于创建 messages 集合中显示的数据:

db.runCommand({ 插入:“消息”, 文件:[{'_id': 1, 'system_id': '123', 'sub_systems':[{'status': 'connected', 'messages_relayed': []}]}] } )

【问题讨论】:

标签: arrays mongodb


【解决方案1】:

您可以尝试下面最简单的查询来观察 MongoDB 如何解释sub_systems.messages_relayed

db.messages.aggregate([
    { "$project": { "arr": "$sub_systems.messages_relayed"}}
]);

所以这个查询将返回一个数组数组,因为sub_systems 是一个外部数组,messages_relayed 是另一个数组。这就是为什么你得到1 而不是0

要“投影空数组的大小”,您应该在您的项目之前使用$unwind,然后聚合将返回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
        }
      }
    }
  }
])

【讨论】:

    猜你喜欢
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 2018-12-19
    • 2019-09-17
    • 2019-11-23
    • 2018-01-16
    • 2021-09-15
    相关资源
    最近更新 更多