Основная проблема с тем, что вы спрашиваете здесь не сводится к тому, что данные о котором идет речь в «массиве », и поэтому есть некоторые базовые предположения, сделанные MongoDB относительно того, как это обрабатывается.
Если вы применили сортировку в порядке« по убыванию », MongoDB выполнит именно то, что вы просите, и отсортируйте документы по« крупнейшим "значение указанного поля в массиве:
.sort({ "revisions.created": -1))
Но если вместо этого вы сортируете в порядке «возрастания», то, конечно, обратное верно и учитывается «наименьшее» значение.
.sort({ "revisions.created": 1 })
Таким образом, единственный способ сделать это означает, что разработка которых максимальная дата от данных в массиве, а затем сортировку по этому результату. В основном это означает применение .aggregate()
, что для метеора операции на стороне сервера, будучи, к сожалению, что-то вроде этого:
Collection.aggregate([
{ "$unwind": "$revisions" },
{ "$group": {
"_id": "$_id",
"name": { "$first": "$name" },
"revisions": { "$push": "$revisions" },
"number": { "$first": "$number" }
"maxDate": { "$max": "$revisions.created" }
}},
{ "$sort": { "maxDate": 1 }
])
Или в лучшем случае с MongoDB 3.2, где $max
могут быть применены непосредственно к выражению массива:
Collection.aggregate([
{ "$project": {
"name": 1,
"revisions": 1,
"number": 1,
"maxDate": {
"$max": {
"$map": {
"input": "$revisions",
"as": "el",
"in": "$$el.created"
}
}
}
}},
{ "$sort": { "maxDate": 1 } }
])
Но на самом деле оба они не так уж велики, даже если подход MongoDB 3.2 имеет меньшие накладные расходы, чем то, что доступно для предыдущих версий, но все равно не так хорошо, как вы можете получить с точки зрения производительности из-за необходимости проходить через данных и выработать значение для сортировки.
Так что для Лучшее исполнение «всегда» сохраняет такие данные, которые вам понадобятся «снаружи» массива. Для этого существует оператор $max
"update", который заменит только значение в документе «если» предоставленное значение «больше» уже имеющегося значения. я.е:
Collection.update(
{ "_id": "qTF8kEphNoB3eTNRA" },
{
"$push": {
"revisions": { "created": new Date("2016-02-01") }
},
"$max": { "maxDate": new Date("2016-02-01") }
}
)
Это означает, что значение, которое вы хотите будет «всегда» уже присутствовать в документе с ожидаемым значением, так что это только сейчас простой вопрос сортировки по этому полю:
.sort({ "maxDate": 1 })
Итак, для моих денег я бы поехал с существующими данными с любым из доступных предложений .aggregate()
и использовал эти результаты, чтобы обновить каждую доккумент, чтобы она содержала поле «maxDate». Затем измените кодировку всех дополнений и ревизий данных массива, чтобы применить это $max
"update" к каждому изменению.
Наличие сплошного поля, а не расчет всегда имеет смысл, если вы используете его достаточно часто. И техническое обслуживание довольно простое.
В любом случае, принимая во внимание выше приложенное дату пример, который «меньше, чем» другие максимальные сроки, присутствующие вернутся за мной во всех формах:
{
"_id" : "5xF9iDTj3reLDKNHh",
"name" : "Lorem ipsum",
"revisions" : [
{
"number" : 0,
"comment" : "Dolor sit amet",
"created" : ISODate("2016-02-11T01:22:45.588Z")
}
],
"number" : 1,
"maxDate" : ISODate("2016-02-11T01:22:45.588Z")
}
{
"_id" : "qTF8kEphNoB3eTNRA",
"name" : "Consecitur quinam",
"revisions" : [
{
"comment" : "Hoste ad poderiquem",
"number" : 1,
"created" : ISODate("2016-02-11T23:25:46.033Z")
},
{
"number" : 0,
"comment" : "Fagor questibilus",
"created" : ISODate("2016-02-11T01:22:45.588Z")
},
{
"created" : ISODate("2016-02-01T00:00:00Z")
}
],
"number" : 2,
"maxDate" : ISODate("2016-02-11T23:25:46.033Z")
}
, правильно размещает первый документ в верхней части порядка сортировки с учетом «maxDate».
На оболочке это будет 'db.coll.find (yourQuery) .sort ({" revisions.created ": - 1})'. Я не имею ни малейшего понятия об метеоре, поэтому вам нужно перевести его самостоятельно. –
@Markus Это работает, когда я сортирую нисходящий, но не восходящий. Затем он использует минимум в наборе. – edgerunner
Ну, Thais именно то, что ваш вопрос заявил. Возможно, вы захотите изменить его и описать проблему более подробно. –