我有一个文档,其中的数组字段包含一个值列表,我希望按数组中的第一个元素进行排序。
{ field1 : "bla", field2 : "bla", field3 : "bla", someArray : [123, 456, 789] }
我当时试图这样查询:
db.testCollection.find({}).sort({"someArray[0]" : 1})
但这似乎没有任何影响,排序被忽略。有什么办法可以做到这一点?
z2acfund1#
是的,按照someArray的第一个元素按升序对集合进行排序的方法是:
someArray
db.testCollection.find().sort({"someArray.0": 1})
这里不需要聚合框架。你已经很接近了!
wfveoks02#
这在mongo find查询中是不可能的,所以应该使用mongo聚合,如下所示
find
db.collectionName.aggregate({"$unwind":"$someArray"},{"$sort":{"someArray":-1}})
但是上面的聚合需要太多的递归,因为它会导致性能问题。所以我认为应该按排序顺序更新someArray,然后使用find查询,这样它就可以按排序方式显示someArray中的结果。下面的查询更新someArray
db.collectionName.update({},{"$push":{"someArray":{"$each":[],"$sort":-1}}},false,true)
用于更新多个文档最后一个true更新完成后,简单查找查询为db.collectionName.find().pretty()
true
db.collectionName.find().pretty()
dldeef673#
它不是忽略升序排序,而是根据each数组中的最小值进行排序。
3条答案
按热度按时间z2acfund1#
是的,按照
someArray
的第一个元素按升序对集合进行排序的方法是:这里不需要聚合框架。你已经很接近了!
wfveoks02#
这在mongo
find
查询中是不可能的,所以应该使用mongo聚合,如下所示但是上面的聚合需要太多的递归,因为它会导致性能问题。所以我认为应该按排序顺序更新
someArray
,然后使用find
查询,这样它就可以按排序方式显示someArray
中的结果。下面的查询更新someArray
用于更新多个文档最后一个
true
更新完成后,简单查找查询为db.collectionName.find().pretty()
dldeef673#
它不是忽略升序排序,而是根据each数组中的最小值进行排序。