MongoDB查找传入的不匹配的值

时间:2019-12-18 14:37:55

标签: 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不存在

首先想到的是使用聚合中的$ project来保存传入的每个_id,然后将每个记录附加到集合中。传递给匹配的_id。例如:

Record 1:

{
    _id: 1,
    Collection1: [
        record details: ...,
        ...
        ...

    ]
},
{
    _id: 2,
    Collection1: [] // This _id passed in, doesn't have a matching collection
}

但是在这种情况下似乎无法获得有效的示例。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

如果输入文档为:

{ _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 ] }

答案 1 :(得分:0)

您要查找$ not吗? MDB Docs