Подтвердить что ты не робот

MongoDB: сортировать вложенный массив объектов

Я ищу способ сортировки вложенного массива объектов. Вот пример:

answers: [
           {name: 'paul', state: 'RU'},
           {name: 'steve', state: 'US'}, 
           {name: 'mike', state: 'DE'}, 
           ...
         ]

Предположим теперь, что я хочу найти все name, массива answers, но отсортировать его по восходящему порядку, как я могу это сделать?

4b9b3361

Ответ 1

Я бы сохранил его в том порядке, в котором вы хотите его вернуть. Или отсортируйте его после того, как вы его вытащите, на стороне клиента.

Если ни один из них не является возможным, вы можете использовать структуру агрегации:

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

дает:

{
  "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
}

Ответ 2

Это может быть не полезно в этом контексте, но я думал, что добавлю это. У вас также есть возможность сортировать его по записи, которая, как правило, лучше для денормализованных коллекций, где вам не нужно сортировать более чем одним способом.

Я нашел эту ситуацию в своем приложении при создании фида для пользователя.

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 }
        }
      }
    });
  }
});

Я нашел, что это очень удобно, потому что вы можете использовать find() и по умолчанию будут сортироваться по вашим спецификациям.

Ответ 3

После выполнения find() вы можете использовать sort() для возвращаемого значения.

db.collection.find({},{"answers.name":1}).sort({"answers.name":1})

Поиск будет извлекать поля имени всех документов в коллекции. Сортировка затем сортирует их по имени, по возрастанию.

http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order