如果$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 }
]