改进了MongoDB中存在的查询字段

Dew*_*wfy 11 indexing name-value mongodb

我正在为我们的客户估算MongoDB.根据需求,我们需要与一些实体ent变量名称 - 值对集合相关联.

db.ent.insert({'a':5775, 'b':'b1'})
db.ent.insert({'c':'its a c', 'b':'b2'})
db.ent.insert({'a':7557, 'c':'its a c'})
Run Code Online (Sandbox Code Playgroud)

在此之后,我需要密集查询ent字段的存在:

db.ent.find({'a':{$exists:true}})
db.ent.find({'c':{$exists:false}})
Run Code Online (Sandbox Code Playgroud)

每个MongoDB 文档:

即使使用索引,$ exists也不是非常有效,尤其是.使用{$ exists:true},因为它实际上必须扫描所有索引值.

那里的专家可以提供更有效的方式(即使转换范式)来快速处理不同的名称 - 值对

And*_*ich 9

您可以像这样重新设计架构:

{
  pairs:[
  {k: "a", v: 5775},
  {k: "b", v: "b1"},
  ]
}
Run Code Online (Sandbox Code Playgroud)

然后你索引你的密钥:

db.people.ensureIndex({"pairs.k" : 1})
Run Code Online (Sandbox Code Playgroud)

在此之后,您将能够通过完全匹配进行搜索:

db.ent.find({'pairs.k':"a"})
Run Code Online (Sandbox Code Playgroud)

如果您使用由@WesFreeman提出的稀疏索引和当前架构,则需要为要搜索的每个键创建索引.它可能会影响写入性能,或者如果您的密钥不是静态的,则无法接受.

  • 所以解决方案是重新设计数据布局,使其看起来像关系数据库?哈哈?为什么 Mongo 不支持对键名建立索引,以便我们可以使“$exists”查询可索引? (2认同)