如何对数组字段中的子文档进行排序?
Posted
技术标签:
【中文标题】如何对数组字段中的子文档进行排序?【英文标题】:How to sort sub-documents in the array field? 【发布时间】:2016-08-20 22:26:22 【问题描述】:我正在使用 MongoDB shell 来获取一些有序的结果。这是一个采样器,
"_id" : "32022",
"topics" : [
"weight" : 281.58551703724993,
"words" : "some words"
,
"weight" : 286.6695125796183,
"words" : "some more words"
,
"weight" : 289.8354232846977,
"words" : "wowz even more wordz"
,
"weight" : 305.70093587160807,
"words" : "WORDZ"
]
我想要的是,相同的结构,但由"topics" : []
排序
"_id" : "32022",
"topics" : [
"weight" : 305.70093587160807,
"words" : "WORDZ"
,
"weight" : 289.8354232846977,
"words" : "wowz even more wordz"
,
"weight" : 286.6695125796183,
"words" : "some more words"
,
"weight" : 281.58551703724993,
"words" : "some words"
,
]
我设法得到了一些有序的结果,但没有按 id 字段对它们进行分组。有没有办法做到这一点?
【问题讨论】:
您需要向我们展示具有预期结果的示例文档,而不仅仅是您得到的结果。 @user3100115 检查更新的问题 【参考方案1】:MongoDB 不提供开箱即用的方法,但有一种解决方法是更新您的文档并使用 $sort
更新运算符对您的数组进行排序。
db.collection.update_many(, "$push": "topics": "$each": [], "$sort": "weight": -1)
您仍然可以像这样使用.aggregate()
方法:
db.collection.aggregate([
"$unwind": "$topics",
"$sort": "_id": 1, "topics.weight": -1,
"$group": "_id": "$_id", "topics": "$push": "$topics"
])
但是,如果您只想对数组进行排序,那么效率会降低,而且您绝对不应该这样做。
您始终可以使用.sort
或sorted
函数来执行此客户端。
【讨论】:
【参考方案2】:如果不想更新只想获取文档,可以使用如下查询
db.test.aggregate(
[
$unwind : "$topics",
$sort : "topics.weight":-1,
"$group": "_id": "$_id", "topics": "$push": "$topics"
]
)
【讨论】:
为管道参数添加"$match": "_id":"12345",
正是我想要得到的!
@BediE 您是否注意到这是我的答案的副本,不会为现有答案增加任何价值?【参考方案3】:
它对我有用:
db.getCollection('mycollection').aggregate(
$project:topics:1,
$unwind:"$topics",
$sort :"topics.words":1)
【讨论】:
这是错误的,它不会给出预期的结果。以上是关于如何对数组字段中的子文档进行排序?的主要内容,如果未能解决你的问题,请参考以下文章