mongodb - MongoDB查找传入的不匹配的值
问题描述
目前遇到使用 MongoDB 聚合的问题。我有一个'_ids'数组,我需要检查它是否存在于特定集合中。
例子:
我在“集合 1”中有 3 条记录,_id 为 1,2,3。我可以使用以下方法找到匹配值:
$match: {
_id: {
$in: [1, 2, 3, 4]
}
}
但是我想知道的是我传入的值(1,2,3,4)。哪些不符合记录。(在这种情况下 _id 4 将没有匹配的记录)
所以不是返回_id 1、2、3的记录。它需要返回不存在的_id。所以在这个例子中'_id:4'
查询还应忽略集合中的任何额外记录。例如,如果集合包含 ID 为 1-10 的记录,并且我传入查询以确定 _ids: 1、7、15 是否存在。我期望的值将沿着 ' _id: 15 doesn't exist
第一个想法是在聚合中使用 $project 来保存传入的每个 _id,然后附加集合中的每条记录。到传入的匹配_id。例如:
Record 1:
{
_id: 1,
Collection1: [
record details: ...,
...
...
]
},
{
_id: 2,
Collection1: [] // This _id passed in, doesn't have a matching collection
}
然而,在这种情况下似乎无法得到一个有效的例子。任何帮助,将不胜感激!
解决方案
如果输入文件是:
{ _id: 1 },
{ _id: 2 },
{ _id: 5 },
{ _id: 10 }
要匹配的数组是:
var INPUT_ARRAY = [ 1, 7, 15 ]
以下聚合:
db.test.aggregate( [
{
$match: {
_id: {
$in: INPUT_ARRAY
}
}
},
{
$group: {
_id: null,
matches: { $push: "$_id" }
}
},
{
$project: {
ids_not_exist: { $setDifference: [ INPUT_ARRAY, "$matches" ] },
_id: 0
}
}
] )
回报:
{ "ids_not_exist" : [ 7, 15 ] }
推荐阅读
- r - 自动下载推文到 json 输出
- python - pyquibase 错误:subprocess.CalledProcessError
- hyperledger-fabric - 如何通过链码将文档批量插入到couchdb
- reactjs - 我们在 mapStateToProps 中使用 state 和 reducer 有什么不同。什么是正确的方法?
- dart - 卡片宽度与父级匹配:颤动
- c - 通过指向函数的指针传递值。我们要在函数内部创建变量的副本吗?
- sql - Oracle 相关子查询
- c# - .Include 在 LINQ 中的性能
- perl - 在perl中用多个空格替换单个空格
- python - xpath没有获取所有链接