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"]
}
}
}
]
}
}
])
结果:
[
{
"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]]
}
}
}
])
结果:
[
{ "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 }
]
如果 $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"]
}
}
}
]
}
}
])
结果:
[
{
"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]]
}
}
}
])
结果:
[
{ "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 }
]