Вам необходимо агрегировать результат, как показано ниже:
Unwind
массив имен.
Sort
записей на основе comments.names.number
по убыванию заказать.
Group
записи, основанные на поле _id
.
project
требуемая структура.
Код:
db.collection.aggregate([
{$unwind:"$comments.names"},
{$sort:{"comments.names.number":-1}},
{$group:{"_id":"$_id",
"var1":{$first:"$var1"},
"var2":{$first:"$var2"},
"var3":{$first:"$var3"},
"field":{$first:"$comments.field"},
"names":{$push:"$comments.names"}}},
{$project:{"comments":{"names":"$names","field":"$field"},"var1":1,
"var2":1,"var3":1}}
],{"allowDiskUse":true})
Если ваша коллекция велика, вы можете добавить $match
критериев в начале трубопровода агрегации для фильтрации записей или использовать (allowDiskUse:true)
, для облегчения сортировки большого количества записей ,
db.collection.aggregate([
{$match:{"_id":someId}},
{$unwind:"$comments.names"},
{$sort:{"comments.names.number":-1}},
{$group:{"_id":"$_id",
"var1":{$first:"$var1"},
"var2":{$first:"$var2"},
"var3":{$first:"$var3"},
"field":{$first:"$comments.field"},
"names":{$push:"$comments.names"}}},
{$project:{"comments":{"names":"$names","field":"$field"},"var1":1,
"var2":1,"var3":1}}
])
Что Ниже запрос делает:
db.collection.find().sort({ "comments.names.number": -1 })
найти все документы, а затем отсортировать эти документы, основанные на числовом поле в порядке убывания. Что это на самом деле делает для каждого документа, получить значение поля comments.names.number
, которое является самым большим для каждого документа. Затем отсортируйте родительские документы на основе этого номера. Он не манипулирует массивом имен внутри каждого родительского документа.
Это неправда. Это возможно с использованием структуры агрегации. – BatScream