Mongo return 哪些输入与 $IN 不匹配

Mongo return what inputs don't match for $IN

如果 $in 中的输入与任何 [=14] 不匹配,Mongo 是否有任何方法 return 某些指示(标志、字段等) =]?

请看我的Mongo Playgrond

那成功只是 return 所有奇怪的文档。

我怎样才能知道没有找到偶数?

我想在 Mongo 内部完成此操作。我知道我可以遍历 JS 中的结果并执行 diff.

Fwiw,我 这个 $in 实际上是 aggregate$match 的第一阶段。所以也许我可以使用 addFields 之类的东西来表示不匹配。

谢谢!

所以我想要的输出可能是每个否定匹配仍然得到一个 returning 文档..但是有一个新的 属性 found:false 如下所示。所以..在我的示例中,偶数 #s 不是 founds,看到类似的东西会很酷..

 {
    "_id": ObjectId("5a934e000102030405100006"),
    "key": 2,
    "found": false
  },
 {
    "_id": ObjectId("5a934e000102230405000006"),
    "key": 4,
    "found": false
  },
 {
    "_id": ObjectId("5a934e000122030405000006"),
    "key": 6,
    "found": false
  }

也许,将 found 也用于所有正匹配项会更清晰。

或者...也许 return 不匹配项的子数组(在 post- 处理中可能更干净)

在 MongoDB 中没有直接的方法可以做到这一点,您可以尝试聚合查询来处理自定义需求,

这里我添加了一个聚合查询来实现你的要求,但是我不确定你的具体数据是多少,

输入:

[
  { "key": 1 },
  { "key": 2 },
  { "key": 3 },
  { "key": 4 },
  { "key": 50 },
  { "key": 6 },
  { "key": 7 }
]
  • $match 你的 $in 条件
  • $facet 将结果和未找到的数字分开
  • result关键是得到你最终的文档结果
  • notFound是查找未找到的键
  • $group by null 并使用 $addToSet
  • 从结果中获取唯一键
  • $setDifference 获取两个数组的差异,第一个是您的输入,第二个是可用的结果数
  • $project 显示必填字段
db.collection.aggregate([
  {
    $match: {
      key: {
        $in: [1, 3, 5, 7]
      }
    }
  },
  {
    $facet: {
      result: [],
      notFound: [
        {
          $group: {
            _id: null,
            key: { $addToSet: "$key" }
          }
        },
        {
          $project: {
            key: {
              $setDifference: [[1, 3, 5, 7], "$key"]
            }
          }
        }
      ]
    }
  }
])

Playground

结果:

[
  {
    "notFound": [
      { "key": [5] }
    ],
    "result": [
      { "key": 1 },
      { "key": 3 },
      { "key": 7 }
    ]
  }
]

第二种方法,按照你预期的结果样本,

  • $addFields 添加新字段 found
  • $in 检查 key 在提供的数组中是否有值,如果是则 return true 否则为 false
db.collection.aggregate([
  {
    $addFields: {
      found: {
        $in: ["$key", [1, 3, 5, 7]]
      }
    }
  }
])

Playground

结果:

[
  { "key": 1, "found": true },
  { "key": 2, "found": false },
  { "key": 3, "found": true },
  { "key": 4, "found": false },
  { "key": 50,"found": false },
  { "key": 6, "found": false },
  { "key": 7, "found": true }
]