MongoDB: структура агрегации: сопоставление $между полями
У меня есть тестовая коллекция с двумя документами:
> db.test.find().pretty()
{ "_id" : ObjectId("510114b46c1a3a0f6e5dd7aa"), "a" : 1, "b" : 2 }
{ "_id" : ObjectId("510114c86c1a3a0f6e5dd7ab"), "a" : 3, "b" : 1 }
С инфраструктурой агрегации я хочу получить только документы, где a больше b.
$ gt получить только значения в аргументе не поля...
> db.test.aggregate([{"$match":{"$a":{"$gt":"$b"}}}])
{ "result" : [ ], "ok" : 1 } /* don't work*/
Есть ли у вас идеи?
Заранее спасибо
С наилучшими пожеланиями
Ответы
Ответ 1
Хмм без особого тестирования на моем конце я скажу, что вы можете использовать $cmp
для этого:
http://docs.mongodb.org/manual/reference/aggregation/cmp/#_S_cmp
db.test.aggregate([
{$project: {
// All your other fields here
cmp_value: {$cmp: ['$a', '$b']}
}},
{$match: {cmp_value: {$gt: 0}}}
])
Там может быть лучший способ, но у меня нет установки MongoDB рядом со мной для тестирования.
Ответ 2
Используйте оператор $expr
.
Представленный в версии 3.6, $expr
может создавать выражения запроса, которые сравнивают поля из одного и того же документа.
Сравните два поля из одного документа (пример взят непосредственно из документов MongoDB):
Рассмотрим ежемесячную коллекцию бюджетов со следующими документами:
{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 }
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 }
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 }
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 }
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 }
Следующая операция использует $expr
для поиска документов, в которых потраченная сумма превышает бюджет:
db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
Операция возвращает следующие результаты:
{ "_id" : 1, "category" : "food", "budget" : 400, "spent" : 450 }
{ "_id" : 2, "category" : "drinks", "budget" : 100, "spent" : 150 }
{ "_id" : 5, "category" : "travel", "budget" : 200, "spent" : 650 }