2016-03-07 4 views
0

У меня есть MongoDB документы, такие как следующие:

{"_id":{"$oid":"56d810f5c91e6779a38386b8"}, 
"timestamp": {"$numberLong":"1457000674750"}} 

Я построение aggregration трубопровода, который должен содержать следующую $project сегмента:

{"$project": 
    {"date": {"$add": ["new Date(3600000)", "$timestamp"]}} 
} 

Это работает в оболочке MongoDB, но я не могу заставить его работать с rmongodb. Например, следующий дает ошибку 10 (BSON недействительной), когда включенной в моем трубопроводе:

mongo.bson.from.list(list(
"$project"= list("date"=list("$add"=list(mongo.code.create("new Date(3600000)"), "$timestamp"))) 
)) 

Я уверен, что проблема связана с кодом (new Date(3600000)) и/или включением его в массиве, который находится в поменяйте аргумент на $add. Я полагаю, что я могу построить буфер BSON «старый путь», но я ищу, как это сделать с mongo.bson.from.list и/или mongo.bson.from.JSON.

+0

Ах, похоже, вы смотрите на другие ответы здесь. «Новые даты (числа)», которые вы видите, касаются создания объекта «Date» «извне» для подачи через драйвер. Это вызов JavaScript для объекта Date, и общее намерение должно быть преобразовано, как вы это делаете на своем языке. Поэтому не так, как вы могли бы сделать это здесь, и ваши намерения полностью не ясны. Ваша временная метка '' 'кажется просто номером, так что вы ожидаете« добавить »? Я думаю, вы имеете в виду 1 час в миллисекундах, и это будет просто номер здесь, а не «Date» –

+0

Short version. 1.Вы делаете это неправильно, вам не нужен объект «code», и вы не можете вставлять JavaScript в структуру агрегации (образцы кода фактически оценивают »до« подачи конвейера »). 2. Не уверен, что вы просите, но, похоже, пытается добавить число в число, но путайте, думая, что это дата. –

+0

Спасибо за ваши комментарии, которые указали на ответ. Мое намерение заключалось в создании объекта даты Date с поправкой на временной шкалу (который можно более легко использовать в последующей групповой операции) из временной метки Unix-epoch, и этот метод из SO работал в оболочке. Подставляя «ISOdate (1970, 01, 01, час = 0, tz =« CET »)', вместо этого «кода» мой оригинальный пример работает. Если вы хотите опубликовать это как ответ, я его одобрю! Еще раз спасибо. – niemand

ответ

0

Как указано, это не «код JavaScript», который должен использоваться для представления даты BSON для инъекций, но, скорее, независимо от того, какой собственный формат используется для Date в языковой среде.

Так r, вы можете использовать следующий вид конструктора, чтобы получить Date от эпохи:

as.POSIXct("1970-01-01",tz="GMT") 

Таким образом, в примере делать преобразование BSON даты на числовое значение и извлечение $year из что:

pipeline <- list(
    mongo.bson.from.list(list(
    '$project' = list(
     'test' = list('$year' = 
     list('$add' = list (
      '$timestamp', 
      as.POSIXct("1970-01-01",tz="GMT"), 
      3600000 
     )) 
    ) 
    ) 
)) 
) 

Тем не менее, есть ничто не мешает вам просто применяя основную математику непосредственно к числовому значению, так же, как пример оператора к сериализованному обозначению:

{ "$project": { 
    "test": { 
     "$add": [ 
      { "$divide": [ 
       { "$subtract": [ 
        { "$add": [ "$timestamp",3600000 ] }, 
        { "$mod": [ 
         { "$add": [ "$timestamp", 3600000 ] }, 
         1000 * 60 * 60 * 24 * 365 
        ]} 
       ]}, 
       1000 * 60 * 60 * 24 * 365 
      ]}, 
      1970 
     ] 
    } 
}} 

Также работает вне текущий «год», и тот же вид операций может быть применен к любой части дня, будь то в настоящее время «год» от «DayOfYear» или что-нибудь.

отметить также, что $project использования не очень рекомендуется, если вы собираетесь $group, как вы бы лучше просто использовать ваше «преобразование» непосредственно в группировке _id, а не на отдельной стадии трубопровода, по причинам производительности избежать еще одного трубопровода проходить.

Единственный раз, когда это будет действительно необходимо $add к Date будет в конечном выходе переделанного «миллисекунд от эпохи» значения в «выходе», где вы хотели BSON Дату, а не числовое значения.

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

  • Нет связанных вопросов^_^