10

在 MongoDB 上,当我们有诸如“草稿”(是/否)、“已发布”(是/否)等字段时,哪个是最好的策略?在所有记录中创建字段并输入“是”/“否”值或将字段放在存在的位置?

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

或者

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

哪个更快?这是针对大量数据的。

最好的问候,若昂

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 }
> 

请注意,如果混合了省略值和显式错误值,则必须编写的查询更加复杂,并且可能导致查询执行速度变慢。

于 2012-07-24T18:46:48.363 回答
4

之前的一些答案谈到了速度,但我认为您不想将 FALSE 响应视为缺失响应的原因是您所有缺失的响应都将被错误地分配为 FALSE。因此,例如,如果您是某人,无论他是否受雇,如果该人受雇于决定不回应,您就会将该人视为未受雇,这是错误的。

于 2014-07-14T03:39:42.267 回答
2

两者都可以,速度可能大致相同。包括draft:false会增加您的磁盘使用量,但它们都是有效的方法。只有测试才能揭示任何性能差异是否足以对您产生影响。

于 2012-07-24T16:25:03.687 回答