2016-10-12 15 views
1

私は7つの配列を持つコレクションがあり、各配列には1000を超えるサブ文書が含まれています。
すなわちMongoDB:複数のフィールドでの単一の更新V/S単一のフィールドでの複数の更新?

{ 
    "_id": 1, 
    "arr1": [ 
     { "date": 20100101, "time": 120000, "key": "value1" }, 
     { "date": 20100401, "time": 121500, "key": "value2" }, 
     ... 
     { "date": 20161001, "time": 120000, "key": "valueN" }, 
    ], 
    . 
    . 
    "arr7": [ 
     { "date": 20100101, "time": 120000, "key": "value1" }, 
     { "date": 20100401, "time": 121500, "key": "value2" }, 
     ... 
     { "date": 20161001, "time": 120000, "key": "valueN" }, 
    ] 
} 

私はすべての配列から特定の日付より古い活動を引きたいです。 iは即ち

db.collection.updateMany({}, { $pull: { arr1: { date: { $lt: 151031 } }, arr2: { date: { $lt: 151031 } }, ... arr7: { date: { $lt: 151031 } } } }) 

一度に各アレイからのマッチングサブドキュメントを引っ張ってくる単一の更新を実行すべきまたは私が各アレイについて別個に更新を実行しなければなりません。すなわち

db.collection.updateMany({}, { $pull: { arr1: { date: { $lt: 20160101 } } } }) 
db.collection.updateMany({}, { $pull: { arr2: { date: { $lt: 20160101 } } } }) 
... 
db.collection.updateMany({}, { $pull: { arr7: { date: { $lt: 20160101 } } } }) 

どちらがより効果的でしょうか?

+0

コレクションには7つの配列のドキュメントが1つしかありませんか?はいの場合、データ設計は本当に悪いです。以前またはそれ以降、あなたは16MB /文書の制限のmongoを実行します... – Robert

+0

いいえ、私は約3200000のような文書を持っていて、それぞれにそのような7つの配列を持っています。このアレイは、時間とともにサイズが増加しています。そして、私は配列から古いサブドキュメントを削除し、私に関連するそのデータだけを残したいと思います。 –

答えて

1

は、私はあなたがすべてのアレイ

db.collection.updateMany({}, { $pull: { arr1: { date: { $lt: 151031 } }, arr2: { date: { $lt: 151031 } }, ... arr7: { date: { $lt: 151031 } } } }) 

これは、実行のモンゴのクエリオプティマイザ完全に制御することができますから引っ張って単一のクエリを使用する必要がありますと言うでしょう。例えば、7回ではなく1回だけ各オブジェクトにアクセスしなければならない場合がある。

explain()https://docs.mongodb.com/v3.2/reference/method/cursor.explain/を参照)を使用して、クエリの正確な実行を見てください。

また、ドキュメントごとのmongo 16MB制限に問題が発生する可能性があるため、データモデルの変更を検討することもできます。また、mongoの配列インデックスは非常に非効率的です。

関連する問題