首页 > 解决方案 > 文档的mongodb默认值不在数组中

问题描述

我需要在 array 中选择 id [1, 2, 3, 4, 5],如果没有带有 Id 的文档3 and 5,我想要这个的默认名称。

例如。

{id:1,name:a}
{id:2,name:b}
{id:4,name:c}

查询某事...

find ... id:{$in:{1,2,3,4,5}}})

-> 结果应该是

{id:1,name:a}
{id:2,name:b}
{id:3,name:defaultvalue}
{id:4,name:c}
{id:5,name:defaultvalue}

我想要 3 和 5 的默认值。

我该怎么查询??请帮忙

标签: mongodbmongodb-query

解决方案


您可以使用MongoDB 聚合框架来实现您的用例

  1. 我从$facet开始并创建了两个数组:
    • missingIDs找出不在文档中的缺失 ID
    • matchedDocuments$project数组 [1,2,3,4,5] 中可用的所有可用文档
  2. 然后连接这两个数组,并使用$addFields$ifNull在 null 时添加名称字段。

尝试以下聚合查询:

db.collection.aggregate([
  {
    $facet: {
      missingIDs: [
        {
          $group: {
            _id: null,
            ids: {
              $push: {
                id: "$id"
              }
            }
          }
        },
        {
          $project: {
            _id: 0,
            ids: {
              $setDifference: [
                [
                  {
                    id: 1
                  },
                  {
                    id: 2
                  },
                  {
                    id: 3
                  },
                  {
                    id: 4
                  },
                  {
                    id: 5
                  }
                ],
                "$ids"
              ]
            }
          }
        },
        {
          $unwind: "$ids"
        },
        {
          $project: {
            id: "$ids.id"
          }
        }
      ],
      matchedDocuments: [
        {
          $match: {
            id: {
              $in: [
                1,
                2,
                3,
                4,
                5
              ]
            }
          }
        },
        {
          $project: {
            id: 1,
            name: 1,
            _id: 0
          }
        }
      ]
    }
  },
  {
    "$project": {
      concat: {
        "$concatArrays": [
          "$matchedDocuments",
          "$missingIDs"
        ]
      }
    }
  },
  {
    $unwind: "$concat"
  },
  {
    "$addFields": {
      "concat.name": {
        "$ifNull": [
          "$concat.name",
          "defaultvalue"
        ]
      }
    }
  },
  {
    $project: {
      id: "$concat.id",
      name: "$concat.name",
      
    }
  },
  {
    "$sort": {
      id: 1
    }
  }
])

MongoDB游乐场


推荐阅读