Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何比较同一文档中数组中的元素?_Javascript_Mongodb_Performance - Fatal编程技术网

Javascript 如何比较同一文档中数组中的元素?

Javascript 如何比较同一文档中数组中的元素?,javascript,mongodb,performance,Javascript,Mongodb,Performance,我找到了比较同一MongoDB集合中不同文档中数组之间的值的方法,但是如何通过索引比较同一文档中同一数组中的元素?下面是有问题的条目: { "_id" : ObjectId("1"), "arr" : [ { "int" : 100 }, { "int" : 10 } ] } 我有一个包含大量这些条目的集合(这里当然简化了),我想查询集合,检查每个条目,如果arr[0].int>arr[1].int返回这些文档。更好的方法是,使用逻辑确定索引1处的元素与索引0处的元素的差异百分比。例如,在这里

我找到了比较同一MongoDB集合中不同文档中数组之间的值的方法,但是如何通过索引比较同一文档中同一数组中的元素?下面是有问题的条目:

{ "_id" : ObjectId("1"), "arr" : [ { "int" : 100 }, { "int" : 10 } ] }
我有一个包含大量这些条目的集合(这里当然简化了),我想查询集合,检查每个条目,如果
arr[0].int>arr[1].int
返回这些文档。更好的方法是,使用逻辑确定
索引1
处的元素与
索引0处的元素的差异百分比。例如,在这里的例子中,
索引1比索引0小10倍

以下内容用于查询mongoDoc中的元素是否大于给定值:

db.collection.find( { "arr.0.int" : { $gt: 10 }})
我已经玩过这个了,但是没有任何东西被证明是有用的。 由于数据集很大,因此性能方面的考虑将非常棒


谢谢

这里的基本情况是简单地应用一个条件,并在每个索引处进行检查:

db.collection.aggregate([
  { "$redact": {
    "$cond": {
      "if": {
        "$gt": [
          { "$arrayElemAt": ["$arr.int", 0] },
          { "$arrayElemAt": ["$arr.int", 1] }
        ]
      },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }}
])
这是一个特殊的管道阶段,它采用的方式是,如果“
条件满足
”,那么“
我们将“$$code>保留”
结果中的文档,否则将从结果中删除它

这使用本机运算符,并且与依赖于计算的查询一样具有“性能”

MongoDB 3.6允许在此基础上使用更短的语法,使用:

甚至可以在
.find()
中实际使用:

自发布以来,所有版本都通过以下方式支持JavaScript评估:

但由于这需要对每个文档计算一个JavaScript表达式,因此它的性能不如使用本机操作符

另外,获得“比率”响应的唯一方法是使用聚合管道,它实际上可以“改变”返回的结果,而
.find()
查询无法做到这一点:

db.collection.aggregate([
  { "$redact": {
    "$cond": {
      "if": {
        "$gt": [
          { "$arrayElemAt": ["$arr.int", 0] },
          { "$arrayElemAt": ["$arr.int", 1] }
        ]
      },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }},
  { "$addFields": {
    "ratio": {
      "$divide": [
        { "$arrayElemAt": ["$arr.int", 1] },
        { "$arrayElemAt": ["$arr.int", 0] }
      ]         
    }
  }}
])
无论如何,“计算作为条件”并没有什么了不起的,因为除了遍历集合中的每个文档并查看它是否符合条件之外,没有其他选择

因此,如果这是“公共逻辑”,那么最好将其存储在文档中。i、 e:

{ "arr": [{ "int": 100 },{ "int": 10 }], "firstIsGreater": true }
然后您实际上可以有效地使用索引进行选择。因此,在更改文档中的内容时编写此条件将取决于您的应用程序逻辑,从而允许您不需要这样的计算


如果您不能以这种方式建模和存储,那么任何一种形式的计算都是您所拥有的。因此,通常最好先考虑一下为什么您认为需要这样一个计算条件。

这里的基本情况是简单地应用一个条件,并在每个索引处进行检查:

db.collection.aggregate([
  { "$redact": {
    "$cond": {
      "if": {
        "$gt": [
          { "$arrayElemAt": ["$arr.int", 0] },
          { "$arrayElemAt": ["$arr.int", 1] }
        ]
      },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }}
])
这是一个特殊的管道阶段,它采用的方式是,如果“条件满足
”,那么“
我们将“$$code>保留”结果中的文档,否则将从结果中删除它

这使用本机运算符,并且与依赖于计算的查询一样具有“性能”

MongoDB 3.6允许在此基础上使用更短的语法,使用:

甚至可以在
.find()
中实际使用:

自发布以来,所有版本都通过以下方式支持JavaScript评估:

但由于这需要对每个文档计算一个JavaScript表达式,因此它的性能不如使用本机操作符

另外,获得“比率”响应的唯一方法是使用聚合管道,它实际上可以“改变”返回的结果,而
.find()
查询无法做到这一点:

db.collection.aggregate([
  { "$redact": {
    "$cond": {
      "if": {
        "$gt": [
          { "$arrayElemAt": ["$arr.int", 0] },
          { "$arrayElemAt": ["$arr.int", 1] }
        ]
      },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }},
  { "$addFields": {
    "ratio": {
      "$divide": [
        { "$arrayElemAt": ["$arr.int", 1] },
        { "$arrayElemAt": ["$arr.int", 0] }
      ]         
    }
  }}
])
无论如何,“计算作为条件”并没有什么了不起的,因为除了遍历集合中的每个文档并查看它是否符合条件之外,没有其他选择

因此,如果这是“公共逻辑”,那么最好将其存储在文档中。i、 e:

{ "arr": [{ "int": 100 },{ "int": 10 }], "firstIsGreater": true }
然后您实际上可以有效地使用索引进行选择。因此,在更改文档中的内容时编写此条件将取决于您的应用程序逻辑,从而允许您不需要这样的计算


如果您不能以这种方式建模和存储,那么任何一种形式的计算都是您所拥有的。因此,通常最好先考虑一下为什么需要这样一个计算条件。

计算“总是”昂贵。你“真的”想做什么?回答一个无关紧要的问题并不是一个很好的回答。嘿,伙计,这确实可以归结为无关紧要的问题b/c问题实际上是关于mongo语法,以及这在mongo中是否可行。计算“总是”昂贵。你“真的”想做什么?回答一个无关紧要的问题并不是一个很好的回答。嘿,伙计,这确实可以归结为无关紧要的问题b/c。问题真的是关于mongo语法,以及这在mongo中是否可行。先生,您是一位绅士,也是一位学者!谢谢你的出色表现!先生,你是一位绅士,一位学者!谢谢你的出色表现!