0

次のような MongoDB ドキュメントがあります。

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

$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.listand/orでこれを行う方法ですmongo.bson.from.JSON

4

1 に答える 1

0

前述のように、インジェクション用の BSON 日付を表すために使用する必要があるのは「JavaScript コード」ではなくDate、言語環境でネイティブ形式が何であれです。

したがって、rでは、次のようなコンストラクタを使用してDateエポック時点を取得できます。

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

したがって、数値に対して BSON Date 変換を実行し、$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なるのは、数値ではなく BSON 日付が必要な「出力」の変換された「エポックからのミリ秒」Date値の最終出力だけです。

于 2016-03-08T02:31:09.250 に答える