如何对数组字段中的子文档进行排序?

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"
])

但是,如果您只想对数组进行排序,那么效率会降低,而且您绝对不应该这样做。


您始终可以使用.sortsorted 函数来执行此客户端。

【讨论】:

【参考方案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)

【讨论】:

这是错误的,它不会给出预期的结果。

以上是关于如何对数组字段中的子文档进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter如何对集合中的文档进行排序,其中包含每个文档的编号字段

如何匹配MongoDB中的子文档数组?

如何修改数组中特定子文档中的字段?

如何根据数组字段的长度对文档进行排序

重命名数组中的子文档字段

如何填充作为另一个文档的数组元素的子文档的字段?