0

これは私のコレクション構造です:

coll{
id:...,   
fieldA:{
   fieldA1:[
       {
           ...
       }
   ], 
   fieldA2:[
       {
           text: "ciao",
       },
       {
           text: "hello",
       },   
   ] 
} 
}

fieldA2コレクション内のすべてを抽出したいのですが、ある場合fieldA2two or more times表示のみが必要ですone

私はこれを試します

Db.runCommand({distinct:’coll’,key:’fieldA.fieldA2.text’}) 

しかし、何もありません。filedA1これはコレクション内のすべてを返します。

だから私は試します

db.coll.group( {

               key: { 'fieldA.fieldA2.text': 1 },

               cond: { } },

               reduce: function ( curr, result ) { },

               initial: { }

            } )

しかし、これは空の配列を返します...

どうすればこれを実行して実行時間を確認できますか?? ありがとうございます!

4

2 に答える 2

1

2.0.4 を実行しているので (アップグレードをお勧めします)、これを MR で実行する必要があります (もっと良い方法があると思います)。何かのようなもの:

map = function(){
    for(i in this.fieldA.fieldA2){
        emit(this.fieldA.fieldA2[i].text, 1); 
        // emit per text value so that this will group unique text values
    }
}

reduce = function(values){
    // Now lets just do a simple count of how many times that text value was seen
    var count = 0;

    for (index in values) {
        count += values[index];
    }

    return count;
}

次に、ドキュメントのコレクションを提供します。これにより_id、 は一意のtext値でfieldA2あり、valueフィールドはコレクションに表示される回数です。

繰り返しますが、これはドラフトであり、テストされていません。

于 2012-12-18T10:35:14.817 に答える
0

答えはMap/Reduceよりも簡単だと思います。個別の値と実行時間を必要とする場合は、次のように機能するはずです。

var startTime = new Date()
var values    = db.coll.distinct('fieldA.fieldA2.text');
var endTime   = new Date();

print("Took " + (endTime - startTime) + " ms");

これにより、values個別のfieldA.fieldA2.text値のリストを含む配列が作成されます。

[ "ciao", "hello", "yo", "sayonara" ]

そして報告された実行時間:

Took 2 ms
于 2012-12-18T10:51:10.803 に答える