mongodb - Mongoose 查询匹配数组的文档,无论其元素顺序如何

标签 mongodb mongoose mongodb-query

使用 MongoDB/Mongoose,考虑我的 test 集合具有以下 2 个文档:

"_id" : ObjectId("5c4e3cef9cd12904cfc7ecc0"),
"name" : "REGISTER1",
"properties" : [
        {
            "property” : "PROP1",
            "value" : "GREEN"
        },
        {
            "property” : "PROP2",
            "value" : "RED"
        }
    ]

"_id" : ObjectId("5c4e3cef9cd12904cfc7ecc0"),
"name" : "REGISTER2",
"properties" : [
        {
            "property" : "PROP2",
            "value" : "RED"
        },
        {
            "property" : "PROP1",
            "value" : "GREEN"
        }
    ]

我使用以下命令来查找寄存器:

db.tests.find(
   { properties: [
            {
                "property" : "PROP2",
                "value" : "RED"
            },
            {
                "property" : "PROP1",
                "value" : "GREEN"
            }
        ]
   }).pretty();

返回REGISTER2,而不是REGISTER1

同样的方法:

db.tests.find(
   { properties: [
            {
                "property" : "PROP1",
                "value" : "GREEN"
            },
            {
                "property" : "PROP2",
                "value" : "RED"
            }
        ]
   }).pretty();

返回REGISTER1,而不是REGISTER2

我需要两个查询都返回元素“REGISTER1”和“REGISTER2”,因为它们之间唯一的变化是属性顺序(数组顺序)。

如何查询以返回 REGISTER1REGISTER2,无论查询元素的数组顺序如何?

最佳答案

您可以使用$all查询此内容:

db.tests.find({
  properties: {$all: [
   {property: 'PROP1', value: 'GREEN'},
   {property: 'PROP2', value: 'RED'} 
]}})

$all 的两个元素都必须存在才能使文档匹配,但顺序无关。

对于 properties 元素除了您要匹配的内容之外还包含更多键的情况,您可以使用 $elemMatch :

db.tests.find({
  properties: {$all: [
   {$elemMatch: {property: 'PROP1', value: 'GREEN'}},
   {$elemMatch: {property: 'PROP2', value: 'RED'}} 
]}})

$elemMatch 确保每个属性/元组匹配相同的元素。

关于mongodb - Mongoose 查询匹配数组的文档,无论其元素顺序如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54393914/

相关文章:

mongodb - 如何在已排序的 MongoDB 集合中找到一行的行号以计算其百分位数?

mongodb - MongoClient 连接到多个主机来处理故障转移?

node.js - 使用 Mongoose 和 Node.Js 防止重复条目

javascript - 类型错误 : Cannot read property 'username' of undefined from Form Submit

python - 在 MongoDB 上使用 $push 更新数组时避免重复值

node.js - Mongoose 独特 :true pre-save hook calls hook before validation

mongodb - 数组中的项目元素

javascript - 使用 Express Node.js 和 mongoose 声明 session

mongodb - Geonear 按距离和时间排序

mongodb - 仅当文档早于 MongoDB 中的新文档时,如何更新插入?