/ / Wykorzystanie mongo.code.create do skonstruowania argumentu tablicowego do $ add - mongodb, rmongodb

Wykorzystanie mongo.code.create do skonstruowania argumentu tablicowego do $ add - mongodb, rmongodb

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 № 1

Jak 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.