2013-04-24 9 views
9

にBSONタイプEOOから変換することはできません私は(ルビー)集約フレームワークを使用しようとしている」と、次のように日付をプロジェクト:のMongoDB:日付

db['requests'].aggregate([ 
{"$project" => { 
    _id: 0, 
    method: '$method', 
    user: '$user', 
    year: {'$year' => '$timestamp'} 
}}]) 

ドキュメントはこの1つのようなものです:

{ 
_id: ObjectId("5177d7d7df26358289da7dfd"), 
timestamp: ISODate("2013-04-12T03:58:05+00:00"), 
method: "POST", 
status: "200", 
inputsize: "874", 
outputsize: "4981", 
user: "131" 
} 

が、私は次のエラーを取得する:

Mongo::OperationFailure: Database command 'aggregate' failed: (errmsg: 'exception: can't convert from BSON type EOO to Date'; code: '16006'; ok: '0.0'). 

私はどの私と全く同じデシベルでこれを実行する場合、それは正常に動作するので、これは奇妙ですmongorestoreと一緒に輸入された。

+0

明らかに、aggregate()に渡される配列の順序は重要です。何かが省略されているフィールドがある場合は、そのフィールドを$一致に追加し、$一致を配列の最初の要素にしたいと思うでしょう。私。 > db.user_account.aggregate([{$ match:{"uts":{$ exists:true}、 "chan_key": "333261c7a72650a95c68d30cd70"}}、{$ project:{"period_month":{$ month: "$ uts {$ sum:1}}}) –

答えて

20

問題は、私がタイムスタンプフィールドなしでいくつかの文書を保存していたことでした。

+0

よろしくお願いします。{\ f2}私も。私は私のタイムスタンプが「無し」の文書を探しましたが、ただ一つの文書しかありませんでした。私はそれを固定し、酔いしれた!クエリは機能します。 –

+1

あなたはそのような文書をどのように見つけたかの例を挙げることができますか? – jsbisht

2

あなたは、このタイムスタンプフィールドなしで一部の文書を持っているために必要な場合は、この(私はJavascriptを/マングースの表記を使用しています)試みることができる:この場合

year: { $cond: [{ $ifNull: ['$timestamp', 0] }, { $year: '$deliveryDateEnd' }, -1] } 

を、タイムスタンプフィールドのないすべての文書を返します-1。他のすべての文書は、期待どおりの年を返します。