文档不在数组中的mongodb默认值

标签 mongodb mongodb-query

我需要在数组 [1, 2, 3, 4, 5] 中选择 id, 如果没有 ID 为 3 和 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 的默认值。

我该如何查询?? 请帮忙

最佳答案

您可以使用 MongoDB aggregation framework 实现您的用例

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

尝试以下聚合查询:

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 Playground

关于文档不在数组中的mongodb默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64380420/

相关文章:

如果给出查询,MongoDB 的 count() 会错误地返回 0

javascript - MongoDB聚合忽略索引顺序

mongodb - 如何在Meteor JS中获取今天和过去7天的记录?

mongodb - 查找字段不存在的所有文档,加上如果字段存在则应用条件

mysql - MongoDB 加载日常数据(还是坚持使用 mysql?)

node.js - 在 jade 中动态创建表

node.js - 如何在 Mongodb 中使用子字典更新数组

javascript - 在 mongodb 中使用 $addtoset 将元素添加到数组

javascript - 基于变量的动态 $in 运算符

mongodb - 使用 mongodb 中的聚合获取所有具有最大值的文档