首页 > 解决方案 > 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
}

然而,在这种情况下似乎无法得到一个有效的例子。任何帮助,将不胜感激!

标签: mongodb

解决方案


如果输入文件是:

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

推荐阅读