MongoDB с node.js , я не могу понять, как сортировать групповую агрегацию

#javascript #node.js #mongodb #sorting #mongodb-aggregation

#javascript #node.js #mongodb #сортировка #mongodb-агрегация

Вопрос:

Я использую node.js для работы с mongodb. Мой запрос дает мне нужные результаты, но, похоже, я вообще не могу их отсортировать, независимо от того, что я пытаюсь отсортировать.

Вот пример запроса

 var query = function (db, callback) {
    var cursor = db.collection('collection').aggregate({
            $match: {
                "startdatetime": {
                    $gte: new Date([fromDate]),
                    $lte: new Date([toDate])
                }
            }
        },
        {$match: {"depth": {$gte: depthFrom, $lte: depthTo}}},
        {$unwind: "$dives"}, {$match: {"depth": {$gte: depthFrom, $lte: depthTo}}},
        {
            $group: {
                _id: {year: {$year: "$startdatetime"},depth: "depth"},
                average: {$avg: "$" [parameter]}
            }
        }, {$sort: {year: 1,depth:1}});
    cursor.each(function (err, doc) {
        assert.equal(err, null);
        if (doc != null) {
            console.log(doc);
        } else {
            callback();
        }
    })
};
  

Из этого я получаю такой результат:

 { _id: { year: 2015, depth: 17.5 }, average: 7.809660041265659 }
{ _id: { year: 2015, depth: 16.5 }, average: 7.849712114661603 }
{ _id: { year: 2016, depth: 17.5 }, average: 7.402677186121112 }
{ _id: { year: 2016, depth: 16.5 }, average: 7.565136208888859 }
  

Мне бы понравился такой результат (по годам, затем по глубине):

 { _id: { year: 2015, depth: 16.5 }, average: 7.849712114661603 }
{ _id: { year: 2015, depth: 17.5 }, average: 7.809660041265659 }
{ _id: { year: 2016, depth: 16.5 }, average: 7.565136208888859 }
{ _id: { year: 2016, depth: 17.5 }, average: 7.402677186121112 }
  

Я пытался сортировать по _id:1, году и глубине, но независимо от того, пробую ли я их по отдельности или в комбинациях, с результатом ничего не происходит.

Я делаю что-то не так?

Заранее спасибо.

Комментарии:

1. опубликуйте образец документа из вашей коллекции

Ответ №1:

Проблема в том, что параметры year and depth находятся в разделе _id object . Поэтому вы должны сортировать с помощью:

 {$sort: {'_id.year': 1, '_id.depth':1 }}
  

Или вы можете добавить фазу проекта перед сортировкой и удалить _id вложенность:

 {$project: {_id: 0, year: '$_id.year', depth: '$_id.depth', average: 1 }}
  

Комментарии:

1. Извините, должен был упомянуть, что я попробовал ваше первое предложение, но оно не работает. Как и ваше второе предложение. Эти два решения проблемы — это те, которые я нашел при поиске решения, но независимо от того, что я пытаюсь отсортировать, ничего не меняется…

Ответ №2:

Я понял это! Это странная проблема… Я понял, поиграв с $project этим, если $project было в конце запроса, оно было проигнорировано, поэтому я попытался поместить два $sort друг за другом. Оказывается, то, что когда-либо было последним в моем запросе, игнорируется. Итак, теперь конец моего запроса выглядит так:

  {$sort:{year:-1}},{$sort:{year:-1}});
  

Я не знаю, является ли это особым случаем для меня, или это «обычная» ошибка, но надеюсь, что я мог бы спасти других от разочарования, которое у меня было.