猫鼬$ elemMatch如何同时查询$ in和$ nin

时间:2018-08-04 03:06:20

标签: javascript mongodb mongoose

我正在使用Mongoose来检查数据库中是否存在元素。

为此,我正在使用类似的东西

object.aggregate([
        {$match: {
                "data": {
                    $elemMatch: {
                        $and:[
                            {name: {$in: ["A", "B"]}},
                            {name: {$nin: ["X"]}}
                        ]
                    }
                }
            }
        }
    ])

问题是文本是数组。因此,当我得到[“ A”,“ X”]时,希望结果为空。

您有什么想法吗?

-----------编辑------------

对象看起来像:

example1 = { // shouldn't find - not in $in
  _id: "123",
  data: [
      {id:"1",name:"E"},
      {id:"2",name:"R"},
      {id:"3",name:"T"}      
  ]
}

example2 = { // shouldn't find - in both $in $nin
  _id: "456",
  data: [
      {id:"4",name:"A"},
      {id:"5",name:"X"},
      {id:"6",name:"Z"}      
  ]
}

example3 = { // should find - only in $in
  _id: "789",
  data: [
      {id:"7",name:"A"},
      {id:"8",name:"L"},
      {id:"9",name:"Z"}      
  ]
}

-----------编辑2 ------------

感谢@Anthony帮助我找到了一个更好的例子。

我认为这个问题发生在array的数组中,例如:

数据集

[
  {
    _id: "456",
    data: [
      {
        field: [
          {
            id: "1",
            name: "A"
          },
          {
            id: "2",
            name: "B"
          },
          {
            id: "3",
            name: "Z"
          }
        ]
      },
      {
        field: [
          {
            id: "4",
            name: "A"
          },
          {
            id: "5",
            name: "X"
          },
          {
            id: "6",
            name: "Z"
          }
        ]
      }
    ]
  }
]

我的元素匹配解决方案获得2个文档: (enter link description here

db.collection.aggregate([
  {
    $match: {
      data: {
        $elemMatch: {
          "$and": [
            {
              "field.name": {
                "$in": [
                  "A",
                  "B"
                ]
              }
            },
            {
              "field.name": {
                "$nin": [
                  "X"
                ]
              }
            }
          ]
        }
      }
    }
  }
])

建议的其他解决方案返回0个文档: (enter link description here

db.collection.find({
  "$and": [
    {
      "data.field.name": {
        "$in": [
          "A",
          "B"
        ]
      }
    },
    {
      "data.field.name": {
        "$nin": [
          "X"
        ]
      }
    }
  ]
})

1 个答案:

答案 0 :(得分:2)

您可以通过简单的查找查询来尝试

db.collection.find({
  "data": {
    "$elemMatch": {
      "$and": [
        { "field.name": { "$in": [ "A", "B" ] } },
        { "field.name": { "$nin": [ "X" ] } }
      ]
    }
  }
}, {
  "data": {
    "$elemMatch": {
      "$and": [
        { "field.name": { "$in": [ "A", "B" ] } },
        { "field.name": { "$nin": [ "X" ] } }
      ]
    }
  }
})

尝试here