gpt4 book ai didi

javascript - 如何根据mongodb中数组内容的差异进行排序?

转载 作者:可可西里 更新时间:2023-11-01 10:22:59 26 4
gpt4 key购买 nike

假设我的收藏中有以下文档:

var data = [
{ myArray: [ { a:1 }, { a:45 }, { a:46 } ] },
{ myArray: [ { a:3 } ] },
{ myArray: [ { a:12 }, { a:3 } ] },
{ myArray: [ { a:14 }, { a:33 }, { a:66 } ] }
]

我想根据“myArray”中最后两个“a”值的差异对它们进行排序。

所以算法应该是:

1) 拒绝任何 myArray 长度 < 2 的文档

var result = [
{ myArray: [ { a:1 }, { a:45 }, { a:46 } ] },
{ myArray: [ { a:12 }, { a:3 } ] },
{ myArray: [ { a:14 }, { a:33 }, { a:66 } ] }
]

2) 找出最后两个“a”值的不同

var result = [
{ myArray: [ { a:1 }, { a:45 }, { a:46 } ], diff: 1 },
{ myArray: [ { a:12 }, { a:3 } ], diff: -9 },
{ myArray: [ { a:14 }, { a:33 }, { a:66 } ], diff: 33 }
]

3) 按“差异”排序

var result = [
{ myArray: [ { a:14 }, { a:33 }, { a:66 } ], diff: 33 },
{ myArray: [ { a:1 }, { a:45 }, { a:46 } ], diff: 1 },
{ myArray: [ { a:12 }, { a:3 } ], diff: -9 }
]

4) 返回结果

最佳答案

最好的方法是使用 .aggregate()如果您的 MongoDB 服务器版本是 3.2 或更高版本。管道中的第一阶段是使用 $match聚合管道运算符过滤掉所有“myArray”长度小于 2 的文档。此操作还减少了要在管道中处理的文档数量。下一阶段是 $project使用 $arrayElemAt 的阶段返回指定索引处的元素的运算符,这里是数组中使用索引 -1 和索引-2 的最后两个元素。当然是 $let这里的运算符用于将这些值分配给变量,然后在 $subtract 中使用这些变量表达式返回差异。最后一个阶段是 $sort对文档进行排序的聚合管道阶段。

db.collection.aggregate([ 
{ "$match": { "myArray.1": { "$exists": true } } },
{ "$project": {
"myArray": "$myArray",
"diff": {
"$let": {
"vars": {
"first": { "$arrayElemAt": [ "$myArray", -2 ] },
"last": { "$arrayElemAt": [ "$myArray", -1 ] }
},
"in": { "$subtract": [ "$$last.a", "$$first.a" ] }
}
}
}},
{ "$sort": { "diff": -1 } }
])

产生这样的东西:

{ "myArray" : [ { "a" : 14 }, { "a" : 33 }, { "a" : 66 } ], "diff" : 33 }
{ "myArray" : [ { "a" : 1 }, { "a" : 45 }, { "a" : 46 } ], "diff" : 1 }
{ "myArray" : [ { "a" : 12 }, { "a" : 3 } ], "diff" : -9 }

我不认为有办法做到这一点,但您始终可以使用 Array.sort 在客户端执行此操作

db.collection.find({ "myArray.1": { "$exists": true } }).toArray().sort(
function(a, b) {
return a === b ? 0 :( a < b ? -1 : 1 );
}
)

这将返回与使用聚合框架的查询相同的结果,只是缺少“diff”字段。另外值得一提的是,聚合解决方案比这快得多。

关于javascript - 如何根据mongodb中数组内容的差异进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36965059/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com