2014-02-11 2 views
7

Когда мне нужно агрегировать вещи по дате, используя aggregate команду на MongoDB, я обычно делаю это:Можно ли вводить данные литья внутри конвейера агрегации на MongoDB?

db.mycollection.aggregate(
{ 
     $project: { 
      day: {$dayOfMonth: "$date"}, 
      mon: {$month: "$date"}, 
      year: {$year: "$date"}, 
     } 
    }, 
    { 
     $group: { 
      _id : {day: "$day", mon: "$mon", year: "$year"}, 
      count: {$sum: 1} 
     } 
    } 
) 

и в конечном счете конкатенировать day, mon и year поля в строки даты в приложении. По многим причинам, хотя, иногда я хочу, чтобы объединить поля, прежде чем покинуть базу данных, поэтому я сначала попробовал:

db.mycollection.aggregate(
{ 
     $project: { 
      day: {$dayOfMonth: "$date"}, 
      mon: {$month: "$date"}, 
      year: {$year: "$date"}, 
     } 
    }, 
    $project: { 
      datestr: { 
       $concat : ["$year", "-", "$month", "-", "$day"] 
      } 
     } 
    }, 

    { 
     $group: { 
      _id : {day: "$day", mon: "$mon", year: "$year"}, 
      count: {$sum: 1} 
     } 
    } 
) 

Это не будет работать, потому что $concat ожидает строки и day, mon и year являются целыми числами. Итак, мой вопрос: могу ли я набирать поле с помощью операции $project?

+1

Отличный вопрос. Откуда у вас было вдохновение :) –

ответ

6

Да, вы можете использовать $substr для отливки номера в строку. Ваш недостающий текст будет выглядеть так:

{ 
    $project: { 
     day_s: { $substr: [ "$day", 0, 2 ] }, 
     mon_s: { $substr: [ "$month", 0, 2 ] }, 
     year_s: { $substr: [ "$year", 0, 4 ] } 
    } 
} 
+1

Узнай что-нибудь новое каждый день. Это действительно должно быть документировано, а это не так. Престижность к вам за то, что вы знаете и отвечаете. –

+1

Это был мой первоначальный источник знаний: https://groups.google.com/forum/#!topic/mongodb-user/LsDR8sSxt40 – heinob

+0

Это имеет смысл, если вы знаете количество цифр заранее. – user3072843

Смежные вопросы