2016-04-26 143 views
1

我正在使用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字段分组他们没有运气。有没有办法做到这一点?

+0

您需要向我们展示了与样本文件预期的结果,而不仅仅是你得到的结果。 – styvane

+0

@ user3100115检查更新的问题 –

回答

3

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功能总是这样做客户端。

1

如果你不想更新,但只得到文件,可以使用下面的查询

db.test.aggregate(
[ 
    {$unwind : "$topics"}, 
    {$sort : {"topics.weight":-1}}, 
    {"$group": {"_id": "$_id", "topics": {"$push": "$topics"}}} 
] 
) 
+0

添加'{“$ match”:{“_id”:“12345”}},'用于管道参数吐出正是我想要的! –

+0

@BediE你有没有注意到这是我的答案的副本,并没有增加任何价值的现有的? – styvane

0

它为我的作品:

db.getCollection('mycollection').aggregate(
{$project:{topics:1}}, 
{$unwind:"$topics"}, 
{$sort :{"topics.words":1}}) 
+0

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

相关问题