MongoDB null字段或true / false

时间:2012-07-24 15:48:37

标签: mongodb

在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"}]

哪个更快?它适用于大量数据。

最好的问候,João

3 个答案:

答案 0 :(得分:9)

更快的是什么?当值为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 }
> 

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

答案 1 :(得分:2)

之前的一些答案谈到了速度问题,但我认为您不希望将FALSE响应视为缺失响应的原因是您错误地将所有丢失的响应分配为FALSE。因此,举例来说,如果你是某个人,无论他是否受雇,如果该人受雇于决定不回应,你会认为该人没有受雇,这是一个错误。

答案 2 :(得分:1)

要么好,速度可能差不多。包括draft:false会增加您的磁盘使用量,但它们都是有效的方法。只有测试才能揭示出任何性能差异对您来说是否足够重要。