MongoDB:对嵌套的对象数组进行排序

Kay*_*lit 15 sorting nested mongodb

我正在寻找一种方法来对嵌套的对象数组进行排序.这是一个例子:

answers: [
           {name: 'paul', state: 'RU'},
           {name: 'steve', state: 'US'}, 
           {name: 'mike', state: 'DE'}, 
           ...
         ]
Run Code Online (Sandbox Code Playgroud)

假设现在我要找到所有name的中,answers阵列,但在方兴未艾的顺序排序的话,我怎么能做到呢?

Eve*_*man 28

我会按照你想要它的顺序存储它.或者在客户端将其拉出后对其进行排序.

如果这些都不可能,您可以使用聚合框架:

> db.test.insert({answers: [
...                 {name: 'paul', state: 'RU'},
...                 {name: 'steve', state: 'US'}, 
...                 {name: 'mike', state: 'DE'}]});
> db.test.insert({answers: [
...                 {name: 'paul', state: 'RU'},
...                 {name: 'steve', state: 'US'}, 
...                 {name: 'xavier', state: 'TX'}]});

db.test.aggregate([
  {$unwind: "$answers"}, 
  {$sort: {"answers.name":1}}, 
  {$group: {_id:"$_id", answers: {$push:"$answers"}}}
]);
Run Code Online (Sandbox Code Playgroud)

生产:

{
  "result" : [
  {
    "_id" : ObjectId("5053b2477d820880c3469364"),
    "answers" : [
      {
        "name" : "paul",
        "state" : "RU"
      },
      {
        "name" : "steve",
        "state" : "US"
      },
      {
        "name" : "xavier",
        "state" : "TX"
      }
    ]
  },
  {
    "_id" : ObjectId("5053af9f7d820880c3469363"),
    "answers" : [
      {
        "name" : "mike",
        "state" : "DE"
      },
      {
        "name" : "paul",
        "state" : "RU"
      },
      {
        "name" : "steve",
        "state" : "US"
      }
    ]
  }
],
  "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)


cor*_*vid 5

这在这种情况下可能没有帮助,但我想我会添加这个。您还可以选择在写入时对其进行排序,这对于您不必以多种方式排序的非规范化集合来说往往更好。

在为用户创建提要时,我在我的应用程序中发现了这种情况。

Meteor.users.helpers({
  'addToFeed': function (gameId, pushData) {
    check(pushData, FeedSchema);
    Meteor.users.update({
      _id: this._id,
      "games.gameId": gameId
    }, {
      $push: {
        "games.$.feed": {
          $each: [pushData],
          $sort: { timestamp: -1 }
        }
      }
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

我发现它非常方便,因为您可以使用find()它,并且默认情况下它将按照您的规格进行排序。