首页 > 解决方案 > MongoDB对象属性检查嵌套数组中是否存在具有特定值的$

问题描述

我有一个这样的数据库集合。

  {
      "name" : "test",
      "gender" : "male",
      "attributes" : [ 
          {
              "field_id" : "123",
              "field_value" : "['Public']"
          }, 
          {
              "field_id" : "124",
              "field_value" : "true"
          },
          {
              "field_id" : "125",
              "field_value" : "['Single']"
          },
      ]
  },
  {
      "name" : "test2",
      "gender" : "male",
      "attributes" : [ 
          
          {
              "field_id" : "125",
              "field_value" : "['Married']"
          },
      ]
  },
  {
      "name" : "test3",
      "gender" : "male",
      "attributes" : [ 
          {
              "field_id" : "123",
              "field_value" : "['Public']"
          },
          {
              "field_id" : "125",
              "field_value" : "['Married']"
          },
      ]
  },
  {
      "name" : "test4",
      "gender" : "male",
      "attributes" : [ 
          {
              "field_id" : "123",
              "field_value" : "['Private']"
          },
      ]
  },
  {
      "name" : "test4",
      "gender" : "male",
      "attributes" : [ 
         
      ]
  }

]

我想获取所有具有field_idas123field_valueas 的记录"Public";+field_id 123属性下不存在的记录。

我试过了

var condition = { "attributes" :  {$elemMatch:{field_id:"123",field_value:{ $in:["Public"] }}}};

queryObj.push(condition);

这可以很好地获取具有 field_idas123field_valueas 的记录Public

但我也想获取field_idas123不存在的记录,我试过这个

var condition1 = 
{ "attributes" :  {$elemMatch:{field_id:"123",$exists:false}}}

queryObj.push(condition1);

但它返回一个错误,因为它的语法不正确。请指导我如何根据需要获取。

这是预期的输出,因为这些记录中只有Public123 field_id或不存在。field_id123

[
  {
      "name" : "test",
      "gender" : "male",
      "attributes" : [ 
          {
              "field_id" : "123",
              "field_value" : "['Public']"
          }, 
          {
              "field_id" : "124",
              "field_value" : "true"
          },
          {
              "field_id" : "125",
              "field_value" : "['Single']"
          },
      ]
  },
  {
      "name" : "test3",
      "gender" : "male",
      "attributes" : [ 
          {
              "field_id" : "123",
              "field_value" : "['Public']"
          },
          {
              "field_id" : "125",
              "field_value" : "['Married']"
          },
      ]
  },
  {
      "name" : "test2",
      "gender" : "male",
      "attributes" : [ 
          
          {
              "field_id" : "125",
              "field_value" : "['Married']"
          },
      ]
  },
  {
      "name" : "test4",
      "gender" : "male",
      "attributes" : [ 
         
      ]
  }

]

标签: node.jsmongodbmongoosemongodb-query

解决方案


您应该将两个 $elemMatch 与 $or 运算符一起使用。

您的查询应该是这样的。

db.collection.find({
  $or: [
    {
      "attributes": {
        "$elemMatch": {
          field_id: "123",
          field_value: "['Public']"
        }
      }
    },
    {
      "attributes": {
        "$not": {
          "$elemMatch": {
            field_id: "123"
          }
        }
      }
    }
  ]
})

工作示例:https ://mongoplayground.net/p/CP3HSKmNpKM


推荐阅读