MongoDB 查询后添加匹配的键到列表

MongoDB add matched key to list after query

我在 MongoDB 中有一个包含嵌入文档列表的文档。让我们举一个带有轮胎列表的汽车文档的简化示例:

{
    "make": "Toyota",
    "color": "blue",
    "tires": [{
        "make": "Mishlen",
        "size": 185
    }, {
        "make": "Mishlen",
        "size": 210
    }]
}

当我运行以下查询查找轮胎尺寸小于 200 的所有汽车时,我得到了相同的文档,但我不知道哪个轮胎与查询匹配。

{"tires.size": {$gt: 200}}

我正在努力实现某种这样的结果:

{
    "make": "Toyota",
    "color": "blue",
    "tires": [{
        "make": "Mishlen",
        "size": 185,
        "matched": true
    }, {
        "make": "Mishlen",
        "size": 210,
        "matched": false
    }]
}

这样我就可以知道哪些轮胎符合我的查询。达到这种结果的最佳方法是什么?在性能方面。

请试试这个:

db.yourCollectionName.aggregate([
    { $addFields: {
        tires: {$filter: {
            input: '$tires',
            as: 'each',
            cond: {$lt: ['$$each.size', 200]}
        }}
    }}
])

收集数据:

{
    "make": "Toyota",
    "color": "blue",
    "tires": [{
        "make": "Mishlen",
        "size": 185
    }, {
        "make": "Mishlen",
        "size": 210
    }]
}

结果:

{
    "make": "Toyota",
    "color": "blue",
    "tires": [{
        "make": "Mishlen",
        "size": 185
    }]
}

参考: $addFields , $filter

您可以使用 $cond (aggregation) 添加新的布尔值。

db.collection.aggregate([
  {
    $addFields: {
      tires: {
        $map: {
          input: "$tires",
          in: {
            make: "$$this.make",
            size: "$$this.size",
            matched: {
              $cond: {
                if: {
                  $lt: [
                    "$$this.size",
                    200
                  ]
                },
                then: true,
                else: false
              }
            }
          }
        }
      }
    }
  }
])

结果:

[
  {
    "color": "blue",
    "make": "Toyota",
    "tires": [
      {
        "make": "Mishlen",
        "matched": true,
        "size": 185
      },
      {
        "make": "Mishlen",
        "matched": false,
        "size": 210
      }
    ]
  }
]

现场演示:MongoPlayground