2017-01-19 3 views
0

検索クエリの結果として各文書の作成日を返す必要があります。それはかなり簡単ですが、私は、適切かつ効率的な最善の方法を見つけることができなかったと思います。各文書の作成時刻を返す

2つのオプションについて考えてみましょう。

  1. タイムスタンプフィールドを含むドキュメントを挿入する。

  2. ObjectIdフィールドの利点を試してください。私はcreated atに到達できることを知っています。 ObjectId("507c7f79bcf86cd7994f6c0e").getTimestamp()が返されますが、これはISODate形式で返されます。私はConvert ISO Date to Date Format yyyy-mm-dd format in javascript

使用することができます。しかし、私は疑問に思うDateISODateを変換できるようにするには、はるかに効率的な方法でのObjectIdタイムスタンプを使用する方法はありませんでしょうか?

私が言っていることは、例で見ることができます。私はデータベース構造があると仮定します。

[{_id: "56c70fe39114aeb633b7f19f" , name: "alex"}, 
{_id: "56cb04630000000000000000" , name: "felix"}] 

最初のオプションは、ドキュメントを挿入するときにタイムスタンプフィールドを追加します。だから、dbはなります。

[ 
    {_id: "56c70fe39114aeb633b7f19f" , name: "alex", timestamp: ""}, 
    {_id: "56cb04630000000000000000" , name: "felix", timestamp: ""} 
] 

クエリは次のように単純です。いずれのオプションで

db.collection.find({}, {name: 1, timestamp: 1}).toArray({ 
    //loop through each document and convert timestamp to date object 
}) 
二番目のオプションで

db.collection.find({}).toArray({ 
    //loop through each document and convert objectId to isoDate and and convert it to date object. 
}) 

、私は結果をトレースし、時間を変換する必要がありますか?何を指示してるんですか?

どちらも実用的ではありません。私は本当に、この状況を処理するモジュールがあるのだろうか?または行う方法は?

答えて

0

あなただけのどこかにその日付を表示するために、JSのDateオブジェクトの変換が必要な場合は、集約フレームワークで$dateToStringオペレータの助けを借りてISODateオブジェクトの書式を設定することができます

db.collection.aggregate(
    [ 
    { 
     $project: { 
      yearMonthDay: { $dateToString: { format: "%Y-%m-%d", date: "$date" } }, 
      time: { $dateToString: { format: "%H:%M:%S:%L", date: "$date" } } 
     } 
    } 
    ] 
) 

{ "_id" : 1, "yearMonthDay" : "2014-01-01", "time" : "08:15:39:736" } 
を返すよう

文書に日付フィールドが必要です

+0

ありがとうございます。私は各文書の作成日を表示したいと思います。私は '_id'フィールドで' dateToString'を試していますが、**はBSONタイプのOIDからDateに変換できないと言っています**あなたは最初のオプションを選択し、新しい日付フィールドを追加することを提案しますか? – mmu36478

+0

@ mmu36478はい、1つのクエリでそのジョブを実行するには、日付フィールドが必要です –

関連する問題