【问题标题】:Mongoees query to find object with array of id's irrespective of their id's order - NodejsMongoees 查询以查找具有 id 数组的对象,而不管其 id 的顺序如何 - Nodejs
【发布时间】:2020-10-08 18:46:06
【问题描述】:
await Product.findOne({ features: ['5e209ea374df9a1a3fd4d3e0', '5ec566ba1b81f05db31ae91d']})

=> Null(它应该返回对象)

await Product.find({ features: ['5ec566ba1b81f05db31ae91d', '5e209ea374df9a1a3fd4d3e0']})

=> 找到对象

我想要查询,以便无论数组中的 id 顺序如何,我都应该得到对象并且它不是匹配的结果我希望它是特定的结果,所以找到的对象应该只有 2 个键有什么帮助吗?

await Product.find({ features: ['5ec566ba1b81f05db31ae91d', '5e209ea374df9a1a3fd4d3e0', 'a1a3fd5e209ea374df94d3e0']})

=> 不应该返回这个查询有两个匹配的 id 的任何结果

这是结果

{
  features: [ 5ec566ba1b81f05db31ae91d, 5e209ea374df9a1a3fd4d3e0 ],
  _id: 5ec5663756ca7576421628d8,
  __v: 1,
  created_at: 2020-05-20T17:17:43.342Z,
  updated_at: 2020-05-27T15:33:07.672Z,
}

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您可以使用$in

    await Product.find({ features: { $in: ['5e209ea374df9a1a3fd4d3e0', '5ec566ba1b81f05db31ae91d'] } })
    

    这会查找具有任何提供的功能 ID 的产品。

    如果您想匹配具有所有提供功能的产品,则可以使用$all 而不是$in

    await Product.find({ features: { $all: ['5e209ea374df9a1a3fd4d3e0', '5ec566ba1b81f05db31ae91d'] } })
    

    **正如下面评论的,$all 不适用于 2 个 id 的查询,并且有两个以上的功能。 **

    另一种方法是使用$and

    await Product.find({ $and: [
       { features: '5e209ea374df9a1a3fd4d3e0'} , 
       { features: '5ec566ba1b81f05db31ae91d'} 
     ]
    })
    

    由于您想将大小限制为两个,因此最终查询会这样,

    await Product.find({ $and: [
       { features: '5e209ea374df9a1a3fd4d3e0'} , 
       { features: '5ec566ba1b81f05db31ae91d'} 
       { features: { $size: 2 } } 
     ]
    })
    

    【讨论】:

    • 仅供参考。如果我们在 features 中有 3 个或更多元素并且 $all 运算符只有 2 个元素,这将不起作用。仅当它们的大小相同时才有效。
    • $in 不是我们想要的,$all 的问题是,如果任何对象有 3 个 id,其中 2 个 id 与我提供的 id 相同,它也会出现在结果中。但是我也只需要精确匹配 id 和长度,所以如果我提供两个 id,结果对象应该只有 2 个 id 1", "some id 2" ] }) 它会给我准确的结果,但问题是如果 som id 2 最初出现那么它将不起作用https://stackoverflow.com/questions/22856201/mongoose-get-docs-matching-the-array
    • @VishalG 知道了,我想你必须使用$and
    • @RobinCSamuel 检查我已添加答案,感谢您的快速帮助
    • @VishalG 不用担心,我已经更新了我在之前评论中提到的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2019-06-13
    相关资源
    最近更新 更多