Задать вопрос
@Scorpiored88

Как искать в aggregate Mongo?

Всем доброго!
Пожалуйста, помогите разобратся.
Есть документы в колекции которые виглядят так:
{ "_id" : "1", "region" : "reg1", "address" : "Office 1", "operation_type" : "receive", "amount" : 30, "dateTime" : ISODate("2018-11-03T15:21:50.783Z") }
{ "_id" : "1", "region" : "reg1", "address" : "Office 1", "operation_type" : "receive", "amount" : 50, "dateTime" : ISODate("2018-11-04T15:21:50.783Z") }


{ "_id" : "1", "region" : "reg1", "address" : "Office 1", "operation_type" : "send", "amount" : 100, "dateTime" : ISODate("2018-11-05T15:21:50.783Z") }
{ "_id" : "1", "region" : "reg1", "address" : "Office 1", "operation_type" : "send", "amount" : 20, "dateTime" : ISODate("2018-11-09T15:21:50.783Z") }


В результате хочу получить суму receive и send по определенному адресу ну и в будущем ещо и по времени :
{ "_id" : null, "receive" : 80, "send": 120 }
Но что то не получается :
db.operations.aggregate([
    { $match: {"address" : "Office 1"}}, 
    {$group: {_id: null, 
        receive: 
            {$sum: { $match: {"operation_type": "receive"} }  },
        send:
            {$sum: { $match: {"operation_type": " send"} } }  
    }}
])

И вместо желаемого результата - ошибка:
"ok" : 0,
	"errmsg" : "Unrecognized expression '$match'",
	"code" : 168,
	"codeName" : "InvalidPipelineOperator"
  • Вопрос задан
  • 201 просмотр
Подписаться 2 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
zoonman
@zoonman
⋆⋆⋆⋆⋆
Не следует использовать стадию $match внутри оператора $sum на стадии группировки.

db.operations.aggregate([
	{
		$match: {"address" : "Office 1"}
	},
	{
		$project: {
			address: "$address",
			received: {
				$cond: [ {$eq: ["$operation_type", "receive"]}, "$amount", 0 ]
			},
			sent: {
				$cond: [ {$eq: ["$operation_type", "send"]}, "$amount", 0 ]
			},
			dateTime: "$dateTime"
		} 
	}, 
	{
		$group: {
			_id: {
				address: "$address",
				day: { $dayOfYear: "$dateTime" },
				year: { $year: "$dateTime" }
			},
			received: {
				$sum: "$received"
			},
			sent: {
				$sum: "$sent"
			}
		}
	}
])
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы