10

MongoDBで、「ドラフト」(yes / no)、「published」(yes / no)などのフィールドがある場合、これが最善の戦略ですか?すべてのレコードにフィールドを作成し、「yes」/「no」の値を入力しますか、それとも存在する場所にフィールドを配置しますか?

posts: [{_id:1, text:"hello", draft:true},{_id:2 text:"world", draft:false}]

また

posts: [{_id:1, text:"hello", draft:true},{_id:2 text:"world"}]

どちらが速いですか?大量のデータ用です。

よろしく、João

4

3 に答える 3

11

何のために速く?値が false の場合にフィールドを省略すると、ドキュメントがわずかに小さくなり、全体的な速度がわずかに向上する可能性があります。

ただし、フィールドを省略すると、特に省略されたフィールドと明示的な false 値が混在している場合に、false のクエリが難しくなります。

このサンプル コレクションでは、さまざまなクエリが何を返すかに注目してください。

> db.test.find()
{ "_id" : ObjectId("500eeb7c42d87d5d861e1219") }
{ "_id" : ObjectId("500eeb8242d87d5d861e121a"), "b" : false }
{ "_id" : ObjectId("500eeb8642d87d5d861e121b"), "b" : true }
> 
> db.test.find({b:true})
{ "_id" : ObjectId("500eeb8642d87d5d861e121b"), "b" : true }
>
> db.test.find({b:false})
{ "_id" : ObjectId("500eeb8242d87d5d861e121a"), "b" : false }
>
> db.test.find({b:{$exists:false}})
{ "_id" : ObjectId("500eeb7c42d87d5d861e1219") }
>
> db.test.find({$or:[{b:false},{b:{$exists:false}}]})
{ "_id" : ObjectId("500eeb7c42d87d5d861e1219") }
{ "_id" : ObjectId("500eeb8242d87d5d861e121a"), "b" : false }
> 

省略された値と明示的に false の値が混在している場合に作成する必要があるクエリはより複雑になり、クエリの実行が遅くなる可能性があることに注意してください。

于 2012-07-24T18:46:48.363 に答える
2

どちらも問題なく、速度はほぼ同じです。含めるdraft:falseとディスク使用量が少し増えますが、どちらも有効なアプローチです。テストするだけで、パフォーマンスの違いがあなたにとって重要であるかどうかが明らかになります。

于 2012-07-24T16:25:03.687 に答える