Javascript 如何比较同一文档中数组中的元素?
我找到了比较同一MongoDB集合中不同文档中数组之间的值的方法,但是如何通过索引比较同一文档中同一数组中的元素?下面是有问题的条目:Javascript 如何比较同一文档中数组中的元素?,javascript,mongodb,performance,Javascript,Mongodb,Performance,我找到了比较同一MongoDB集合中不同文档中数组之间的值的方法,但是如何通过索引比较同一文档中同一数组中的元素?下面是有问题的条目: { "_id" : ObjectId("1"), "arr" : [ { "int" : 100 }, { "int" : 10 } ] } 我有一个包含大量这些条目的集合(这里当然简化了),我想查询集合,检查每个条目,如果arr[0].int>arr[1].int返回这些文档。更好的方法是,使用逻辑确定索引1处的元素与索引0处的元素的差异百分比。例如,在这里
{ "_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中是否可行。先生,您是一位绅士,也是一位学者!谢谢你的出色表现!先生,你是一位绅士,一位学者!谢谢你的出色表现!