変換

2016-05-26 2 views
13

私は今、このシナリオにいる:私はuserRef +のserialNumberによってそれらをグループ化し、すべての文書を集約する必要が変換

{ 
    _id:ObjectId('56edbb4d5f084a51131dd4c6'), 
    userRef:ObjectId('56edbb4d5f084a51131dd4c6'), 
    serialNumber:'A123123', 
    ... 
} 

ので、私:私はコレクションのXを持っている 「このように連結使用しようとは:m

したがって、基本的にMongoDBの私の凝集の
$group: { 
     _id: { 
      '$concat': ['$userRef','-','$serialNumber'] 
     }, 
     ... 

、私がのObjectIdと、文字列の連結によって、グループ文書にする必要があります。

uncaught exception: aggregate failed: { 

    "errmsg" : "exception: $concat only supports strings, not OID", 
    "code" : 16702, 
    "ok" : 0 
} 

集約式の中の文字列にのObjectIdを変換する方法はあります:しかし、$の連結のみをパラメータとして文字列を受け入れるようですか?

EDIT

このquestionは、関連ですが、私は解決策は、私の問題に適合していません。 (特に、集計中にObjectId.toString()を使用できないため)

実際、MongoのドキュメントではObjectId()。toString()操作は見つかりませんでしたが、難しいことはありますか?この場合に行われます。

+0

おそらく '_id:[$ userRef、$ serialNumber]'は動作しますか?それはあなたに文字列を与えることはありません。 –

答えて

6

私が望むやり方を見つけることができなかったので、代わりに、最終的に(他のキーを連結する)方法でキーを生成したMapReduce関数を作成しました。あなたは$concat前に文字列に任意のオブジェクトをキャストする$substrhttps://docs.mongodb.com/manual/reference/operator/aggregation/substr/#exp._S_substrを使用することができます

db.collection('myCollection').mapReduce(
    function() { 
     emit(
      this.userRef.str + '-' + this.serialNumber , { 
       count: 1, 
       whateverValue1:this.value1, 
       whateverValue2:this.value2, 
       ... 
      } 
     ) 
    }, 
    function(key, values) { 
     var reduce = {} 
     .... my reduce function.... 
     return reduce 
    }, { 
     query: { 
      ...filters_here.... 
     }, 
     out: 'name_of_output_collection' 
    } 
); 
+1

あなたが書いたコードは何ですか? –

+2

@SudhanshuGaurこれが役立つかどうかを確認してください。私はそのコメントを編集しました –

+0

あなたの答えをありがとう実際に私は集約とマップの削減について読んでいたと私はマップの削減が多くの時間を遅くし、集約thatisy私はあなたがcoulfこれを行う場合は、より良いだろうと思ったagregation。 –

-1

:終わり

が、それはこのようなものを見ました。

これは私の役に立つコードのサンプルです。

group_id_i['_id'] = { 
    '$concat' => [ 
     { '$substr' => [ {'$year' => '$t'}, 0, -1] }, '-', 
     { '$substr' => [ {'$month' => '$t'}, 0, -1] }, '-', 
     { '$substr' => [ {'$dayOfMonth' => '$t'}, 0, -1] } 
    ] 
} 

tは、日時フィールドがあり、そのようなこの集計データを返します。

{ 
    "_id" => "28-9-2016", 
    "i" => 2 
} 
+0

$ substrはObjectIdではなく日付で動作するようです – rrrr

0

私はあなたの両方のフィールドを含む配列を使用して、それを解決しようとするかもしれないと思う:

{$project:{newkey:['$userRef','$serialNumber']},{$match:{newkey:{$in:filterArray}}}} 

これはフィルタに両方のフィールドでデータを一致させることができます。 newkey配列のデータは、filterArray要素と同じデータ型である必要があります。