Возможно ли вернуть вычисленное поле из запроса 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
}