查询一个字段等于另一个数组字段?

时间:2016-04-12 02:32:08

标签: javascript mongodb mongodb-query aggregation-framework

假设这样的集合:

{
   movie : 1,
   List : [ 1 , 2 ,5 , 6 ]
},
{
   movie : 2,
   List : [ 3, 5, 7 ]
},
{
   movie : 3,
   List : [ 1, 3, 6 ]
}

我想要获得所有电影'电影'存在于'列表'。

如何编写查询或聚合?

1 个答案:

答案 0 :(得分:1)

理想的形式是本地运营商使用.aggregate()$redact

db.collection.aggregate([
  { "$redact": {
    "$cond": {
      "if": {
        "$setIsSubset": [
          { "$map": { "input": ["A"], "as": "el", "in": "$movie" } },
          "$List"
        ]
      },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }}
])

如果您的MongoDB版本中没有$redact,请改用$where查询条件:

db.collection.find(function() {
  return this.List.indexOf(this.movie) != 1
})

两者都有基本的方法来查找文档中数组字段中存在的一个字段的值。

您可以使用$redact使用几种不同的表单,例如此$anyElementTrue来电:

db.collection.aggregate([
  { "$redact": {
    "$cond": {
      "if": {
        "$anyElementTrue": {
          "$map": {
            "input": "$List",
            "as": "el",
            "in": { "$eq": [ "$$el", "$movie" ] }
          }
        }
      },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }}
])

以及MongoDB 3.2的原始语法更短:

db.collection.aggregate([
  { "$redact": {
    "$cond": {
      "if": {
        "$setIsSubset": [
          ["$movie"],
          "$List"
        ]
      },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }}
])

正如使用$map一样,["$movie"]使单个元素成为您使用$setIsSubset进行比较的数组/集合。在后一种情况下,$map只是将一个条件应用于数组的每个元素,以返回true/false值的数组,然后通过{{3}将其减少为逻辑单true/false }。