MongoDB null字段或true/false

joa*_*ves 8 mongodb

在MongoDB上,当我们有"草稿"(是/否),"已发布"(是/否)等字段时,这是最好的策略吗?在所有记录中创建字段并输入"是"/"否"值或将字段放在哪里?

posts: [{_id:1, text:"hello", draft:true},{_id:2 text:"world", draft:false}]
Run Code Online (Sandbox Code Playgroud)

要么

posts: [{_id:1, text:"hello", draft:true},{_id:2 text:"world"}]
Run Code Online (Sandbox Code Playgroud)

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

最好的问候,João

Rob*_*tam 10

更快的是什么?当值为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 }
> 
Run Code Online (Sandbox Code Playgroud)

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

  • 即使你省略了字段,如果使用`$ ne`,它仍然是一个简单的查询.`db.test.find({b:{$ ne:true}})` (6认同)
  • @JohnnyHK,好像`{B:{$于:假的,空]}}`是一个更好的选择(http://docs.mongodb.org/manual/faq/indexes/#using-ne-and- NIN-IN-A-查询是慢,为什么).我在`b`上运行一个带有简单索引的`.explain`,它使用`$ in`代替`$ ne`显示较少的扫描对象. (4认同)