【问题标题】:MongoDB Find values passed in that don't matchMongoDB查找传入的不匹配的值
【发布时间】:2019-12-19 11:31:22
【问题描述】:

目前遇到使用 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


    【解决方案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 ] }
    

    【讨论】:

    • 谢谢!正是我想要的。非常感谢
    【解决方案2】:

    您在寻找 $not 吗? MDB Docs

    【讨论】:

    • 类似!但是 $not 不会告诉我哪些记录不存在。它会显示存在的记录,但不符合我的条件
    猜你喜欢
    • 1970-01-01
    • 2022-06-16
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    相关资源
    最近更新 更多