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

标签 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 ]
}

我想获取“列表”中存在“电影”的所有文档。

如何编写查询或聚合?

最佳答案

理想的形式是使用带有 $redact.aggregate() 的原生运算符:

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

或者如果您没有 $redact在您的 MongoDB 版本中可用,请改用 $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 值的数组,然后通过 $anyElementTrue 将其简化为逻辑单个 true/false .

关于javascript - 查询一个字段等于另一个数组字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36562629/

相关文章:

mongodb - Mongo stats() 函数显示的 "size"和 "storageSize"有什么区别

javascript - 为什么这个数组中的值(显然)立即改变

javascript - 如何使用 angularjs 从 json 文件填充选择选项

c# - MongoDb Driver 2 - 单例实例弹性

mongodb - 从数组中获取匹配的嵌入文档

node.js - 想要在cloud9本地服务器上安装mongodb

javascript - 当从自定义元素的范围内加载 jQuery 时,为什么可以从控制台访问 jQuery?

javascript - React 单击以卸载组件消息

python - 文档中的 Mongoengine creation_time 属性

python - 尝试使用 python 连接到 azure cosmos 客户端,出现 104 连接中止错误