Запрос Mongo DB: элемент массива проекта к свойству

#mongodb-query #aggregation-framework

#mongodb-запрос #платформа агрегации

Вопрос:

Наличие следующих данных

 {
   "_id": "...",
   "name": "John",
   "purchases": [
       {
            "date": {
                "$date": "2016-12-20T00:00:00.000Z"
            },
            "amount": 1000
       },
       {
            "date": {
                "$date": "2016-12-23T00:00:00.000Z"
            },
            "amount": 100
       }    

   ]
}
  

Как получить последнюю сумму покупки в качестве поля результата с другим именем?

Чтобы получить следующий результат:

 {
    "_id": "...",
    "name": "John",
    "purchases": [
           {
                "date": {
                    "$date": "2016-12-20T00:00:00.000Z"
                },
                "amount": 1000
           },
           {
                "date": {
                    "$date": "2016-12-23T00:00:00.000Z"
                },
                "amount": 100
           }    

       ]
    },
    "latestPurchaseAmount": 100
}
  

Ответ №1:

Вы должны использовать $rename взгляните на эту ссылку

И для вашего последнего пункта вы должны взглянуть на это, это поможет вам по ссылке

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

1. $rename похоже, это оператор обновления. Но мне нужно переименовать поле из-за проекции.

Ответ №2:

Вы можете сделать что-то вроде этого. Приведенный ниже запрос проанализирует все покупки в коллекции и отсортирует покупки по дате по убыванию, а результат ограничит единицей и запроектирует соответствующую сумму.

 db.purchases.aggregate([{
    $unwind: "$purchases"
}, {
    $sort: {
        "purchases.date": -1
    }
}, {
    $limit: 1
}, {
    $project: {
        _id: 0,
        latestPurchaseAmount: "$purchases.amount"
    }
}]);
  

Вывод

 { "latestPurchaseAmount" : 100 }
  

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

1. Спасибо, это похоже на то, что мне нужно. Как насчет людей без покупок, будет ли это выводиться? Есть ли способ отфильтровать количество, не пропустив пользователя?

2. Лица без покупок не будут рассматриваться как $unwind ничего не вернет, если массив покупок пуст или не существует.