Mam dokumenty MongoDB, takie jak:
{"_id":{"$oid":"56d810f5c91e6779a38386b8"},
"timestamp": {"$numberLong":"1457000674750"}}
Buduję potok agregacji, który powinien zawierać następujące elementy $project
człon:
{"$project":
{"date": {"$add": ["new Date(3600000)", "$timestamp"]}}
}
Działa to w powłoce MongoDB, ale nie mogę zmusić go do pracy rmongodb
. Na przykład następujący komunikat o błędzie 10 (niepoprawny BSON), gdy jest uwzględniony w moim potoku:
mongo.bson.from.list(list(
"$project"= list("date"=list("$add"=list( mongo.code.create("new Date(3600000)"), "$timestamp")))
))
Jestem prawie pewien, że problem dotyczy kodu (new Date(3600000)
) i / lub włączenie go do tablicy, która z kolei jest argumentem $add
. Przypuszczam, że mogę zbudować bufor BSON w „stary sposób”, ale szukam tego, jak to zrobić mongo.bson.from.list
i / lub mongo.bson.from.JSON
.
Odpowiedzi:
0 dla odpowiedzi № 1Jak wspomniano, „nie jest to„ kod JavaScript ”, który musi być użyty do przedstawienia daty BSON do wstrzyknięcia, ale niezależnie od formatu natywnego dla Date
w środowisku językowym.
Więc w r
, możesz użyć następującego rodzaju konstruktora, aby uzyskać Date
od epoki:
as.POSIXct("1970-01-01",tz="GMT")
Tak więc w przykładzie wykonania konwersji daty BSON na wartość liczbową i wyodrębnienia $year
z tego:
pipeline <- list(
mongo.bson.from.list(list(
"$project" = list(
"test" = list( "$year" =
list( "$add" = list (
"$timestamp",
as.POSIXct("1970-01-01",tz="GMT"),
3600000
))
)
)
))
)
To powiedziawszy, nic nie stoi na przeszkodzie, abyś po prostu zastosował podstawową matematykę bezpośrednio do wartości liczbowej, podobnie jak przykład operatora do notacji szeregowej:
{ "$project": {
"test": {
"$add": [
{ "$divide": [
{ "$subtract": [
{ "$add": [ "$timestamp",3600000 ] },
{ "$mod": [
{ "$add": [ "$timestamp", 3600000 ] },
1000 * 60 * 60 * 24 * 365
]}
]},
1000 * 60 * 60 * 24 * 365
]},
1970
]
}
}}
Działa również na bieżący „rok”, a ten sam rodzaj operacji można zastosować do dowolnej części daty, czy to bieżącego „roku” „dayOfYear”, czy cokolwiek innego.
Zwróć też uwagę na to $project
użycie nie jest naprawdę zalecane, jeśli masz zamiar $group
ponieważ lepiej byłoby po prostu użyć „konwersji” bezpośrednio w grupie _id
zamiast na oddzielnym etapie potoku, ze względu na wydajność w celu uniknięcia kolejnego przejścia potoku.
Jedyny raz, kiedy to naprawdę byłoby konieczne $add
do a Date
będzie w końcowym wyniku konwersji „milisekunda od epoki” wartość w „wynikach”, w której chciałeś Data BSON zamiast wartości liczbowej.