【问题标题】:Mongo return what inputs don't match for $INMongo 返回与 $IN 不匹配的输入
【发布时间】:2022-01-22 07:36:48
【问题描述】:

如果$in 中的输入与任何docs 不匹配,Mongo 有什么方法可以返回一些指示(标志、字段等)?

请看我的Mongo Playgrond

成功只是返回所有奇怪的文档。

我怎样才能有一些迹象表明未找到事件?

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

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

谢谢!

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

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

也许,将found 也用于所有正匹配会更简洁。

或者...可能返回不匹配的子数组(在后处理中可能更清晰)

【问题讨论】:

  • 请澄清您的问题,您的问题无法理解。
  • 另外:请在此处发布输入文档、尝试的 agg 逻辑和所需的输出形状。 SO 政策是用外部链接(例如 mongo 游乐场)补充这些材料,而不是替换。
  • 如果找不到$in 的方式,将返回一个空光标,您可以在驱动程序see 上进行测试,如果您可以提供 json 示例数据和预期输出,我们知道你需要什么

标签: javascript mongodb aggregation-framework


【解决方案1】:

在 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 在提供的数组中是否有值,如果是则返回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 }
]

【讨论】:

  • 第一个场景对于 OP 的样子可能有点矫枉过正,但它非常酷。
猜你喜欢
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 2018-03-09
相关资源
最近更新 更多