Возможно ли вернуть вычисленное поле из запроса MongoDB?
В SQL я мог бы сделать что-то вроде
SELECT myNum, (myNum+1) as `increment` FROM myTable
эффективно выполняет произвольные математические и другие функции и возвращает их как поле в результате. Можно ли это сделать с MongoDB?
db.test.find({}, {_id:1, myNum:1, increment:function() { return this.myNum + 1;}});
Это не возвращает поле "increment", как я ожидал.
Все другие связанные вопросы, которые я мог найти по этой теме, касаются запросов GROUPed, которых нет; Я просто добавляю "виртуальное" поле в документ, когда он извлекается (на клиентской стороне вычислено?).
В качестве альтернативы эта проблема представляется "картой" без "сокращения"; каждая строка имеет собственное вычисленное поле. Есть ли способ вернуть результат функции карты в результате/курсор?
Ответы
Ответ 1
Новая Агрегационная структура в MongoDB 2.2 позволяет добавлять расчетные поля через $project. Это не совсем то же самое, что и произвольные функции, потому что вам нужно использовать поддерживаемые операторы, но это обеспечивает большую гибкость.
Вот ваш пример приращения _id
в новое поле myNum
:
MongoDB shell version: 2.2.0-rc0
> db.test.insert({_id:123});
> db.test.insert({_id:456});
> db.test.aggregate(
{ $project : {
_id : 1,
'myNum': { $add: [ "$_id", 1]}
}}
)
{
"result" : [
{
"_id" : 123,
"myNum" : 124
},
{
"_id" : 456,
"myNum" : 457
}
],
"ok" : 1
}