【问题标题】:MongoDB object property check if $exists with certain value in nested arrayMongoDB对象属性检查嵌套数组中是否存在具有特定值的$
【发布时间】:2020-10-12 14:22:04
【问题描述】:

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

  {
      "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_id123field_value"Public" 的记录; + 记录其中field_id 123 不存在于属性下。

我试过了

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

queryObj.push(condition);

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

但我也想获取 field_id as 123 不存在的记录,我试过了

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

queryObj.push(condition1);

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

这是预期的输出,因为这些记录只有 Public 123 field_idfield_id 的值,因为 123 在这些记录中不存在。

[
  {
      "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" : [ 
         
      ]
  }

]

【问题讨论】:

  • 您的预期输出是什么?
  • @CuongLeNgoc 我已经更新了问题并在其中添加了预期的输出。

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

你应该使用两个带有 $or 运算符的 $elemMatch。

您的查询应该是这样的。

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

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

【讨论】:

    猜你喜欢
    • 2022-08-04
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    相关资源
    最近更新 更多