Mongo 返回与$IN不匹配的输入



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

请查看我的Mongo Playgrond

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

我怎么能有迹象表明没有找到偶数呢?

我想在Mongo内部做这件事。我知道我可以迭代JS中的结果并执行diff

Fwiw,I这个$in实际上将是aggregate$match的第一阶段。所以,也许我可以使用类似addFields的东西来进行取消匹配。

谢谢!

因此,我想要的输出可能是,每个负匹配仍然会得到一个返回的文档。。但是具有如下的新特性CCD_ 9。所以…在我的例子中,evens#s不是found,看到这样的东西会很酷。。

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

也许,对于所有积极的匹配,也将found设为真会更干净。

或者。。。可能会返回一个未匹配的子阵列(在后处理中可能更干净(

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

在这里,我添加了一个聚合查询来满足您的要求,但我不确定您的确切数据是什么,

输入:

[
{ "key": 1 },
{ "key": 2 },
{ "key": 3 },
{ "key": 4 },
{ "key": 50 },
{ "key": 6 },
{ "key": 7 }
]
  • $match您的$in条件
  • $facet用于分离结果和未找到的数字
  • result的关键是获得您的最终文档结果
  • notFound用于查找未找到的密钥
  • $group,并使用$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"]
}
}
}
]
}
}
])

游乐场

结果:

[
{
"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]]
}
}
}
])

游乐场

结果:

[
{ "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 }
]

最新更新