0

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

{
  _id: 3, 
  key: 3, 
  stuff: "Some data"
}

一部のドキュメントには、signUpDate

次のように、デモ目的でコレクションを作成できます。

for(i=1; i<=100000; i++){
if(i%3===0)
     db.numbers.insert({_id:i, key:i, stuff:"Some data", signUpDate: new Date()});
else
     db.numbers.insert({_id:i, key:i, stuff:"Some data"});
}

...つまり、ドキュメントの 3 分の 1 に signUpDate があります

私がやろうとしているのは、signUpDate が null でないすべてのドキュメントを取得する map reduce 関数を作成し、それらを別のコレクションに挿入し、ランダムに並べることです。

これは可能ですか?

4

1 に答える 1

0

わかりました、これがうまくいく解決策です:

モンゴシェルの使用:

まず、データを入力します。

for(i=1; i<=100000; i++){
if(i%3===0)
     db.numbers.insert({_id:i, key:i, stuff:"Some data", signUpDate: new Date()});
else
     db.numbers.insert({_id:i, key:i, stuff:"Some data"});
}

これで、データの 3 分の 1 に signUpDate が含まれています。

さて、非常に単純な mapreduce :

m = function() {emit(this._id, Math.random());}
r = function(key, values){}

db.numbers.mapReduce(m,r, {out: "randomlyOrdered", query: { signUpDate: { $ne : null } }});

次に、ソートを高速化するための ensureIndex:

db.randomlyOrdered.ensureIndex({"value":1});

今、数字を見つけてください(ランダムにソートされています)

db.randomlyOrdered.find({}, {"_id":1}).sort({"value":1});
于 2012-11-28T17:07:07.877 に答える