2017-03-29 11 views
0

私は2つの大きなコレクションを使用しています(小さなデータはコレクションAにあり、大きなバイナリデータはコレクションBにあります)。彼らはすべての今、私のようなものに基づいて、両方のコレクションからすべてを削除したい、同じkeyありますコレクションAからの結果に基づいてコレクションBから削除

db.A.remove({ field1: 10 }) 

フィールド1だけのコレクションAに存在しているが、私は、収集B. soから同じkeyとの結果を削除する必要があります私はdb.A.find()でカーソルを作成し、db.Bのすべてを1つずつ削除します。それは動作しますが、50k +アイテムのような大きなコレクションでは非常に遅いので、クエリに基づいて項目を削除するだけで100k操作が好きです。より良い方法がありますか?

var _ids = []; 
A.find({ field1: 10 }).stream().on('data', function(data) { 
    _ids.push(data._id); 
}).once('close', function() { 
    A.remove({ field1: 10 }); 
    B.remove({ _id: { $in: _ids } }); 
}); 

: はまた、$はIDの数には限界があるので、私はいくつかの素晴らしい解決策を探してる...オペレータとマングースで$で

、私のようなものとなった可能性がありそれはちょっとうまくいくが、私は演算子で$でクエリの制限がヒットするのではないかと恐れている。

+0

コードの例はありますか? –

+0

@MoiSyme私はMongooseを思い付くことができるものを追加しました –

答えて

1

私はMongooseを使用しませんが、mongodbシェルで可能な解決策を提供できます。あなたはMongooseで適切なコードを作成できると信じています。

var _ids = db.A.distinct('_id',{field1: 10}); 
B.remove({_id:{$in:_ids}}); 
A.remove({field1:10}); 
+0

はい、それはほぼ同じです、問題はまだ考えています - もし_idsの量がデフォルトの16MBの制限を超えると失敗します –

+0

(私が考えることができる)唯一の可能な解決策は、ページ分割のプロセスです。たとえば、i = 0〜n/500の繰り返しを行い、({field1:10})skip(i * 500).limit(500)を見つけ出し、500エントリのIDを抽出し、 Bコレクション。 –

+0

あなたは正しいです、グループ分けでページ区切り!これは限界を解決するかもしれない –

関連する問題