Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb索引建议_Mongodb_Indexing_Mongodb Query - Fatal编程技术网

Mongodb索引建议

Mongodb索引建议,mongodb,indexing,mongodb-query,Mongodb,Indexing,Mongodb Query,第一次使用mongodb时,我需要索引建议方面的帮助。在我的mongo数据库中,我收集了近1500万个文档。附件是json文档。“playfields”是嵌入文档的数组。我经常运行以下查询。值字段中的数据存储在不同的数据类型(字符串、int)中。我的问题是,为了涵盖以下查询,在此文档上添加的最佳索引是什么: db.playfieldvalues.find({"playfields":{$elemMatch:{ID:"Play.NHL.NHLEventX", value: -47}}}) 示例J

第一次使用mongodb时,我需要索引建议方面的帮助。在我的mongo数据库中,我收集了近1500万个文档。附件是json文档。“playfields”是嵌入文档的数组。我经常运行以下查询。值字段中的数据存储在不同的数据类型(字符串、int)中。我的问题是,为了涵盖以下查询,在此文档上添加的最佳索引是什么:

db.playfieldvalues.find({"playfields":{$elemMatch:{ID:"Play.NHL.NHLEventX", value: -47}}})
示例JSON文档:

{
  "Playid": "9dbc7763-7d47-44e9-8b11-e1ec864407bb",
  "Playfields": [
    {
      "ID": "XInfo_OffTeam",
      "Value": "Dallas",
      "TS": "201709291148408452"
    },
    {
      "ID": "XInfo_DefTeam",
      "Value": "Kansas",
      "TS": "201709291148456267"
    },
    {
      "ID": "XInfo_Period",
      "Value": 1,
      "TS": "201709291148456267"
    },
    {
      "ID": "XInfo_OffScore",
      "Value": 38,
      "TS": "201709291148456267"
    },
    {
      "ID": "XInfo_DefScore",
      "Value": 21,
      "TS": "201709291148456267"
    },
    {
      "ID": "XInfo_PlayAction",
      "Value": "Y",
      "TS": "201709291148456267"
    }
  ]
}

如果您对
游戏场的查询总是使用
$elemMatch
操作符来处理
ID
Value
的配对,然后在
Playfields.ID
上创建一个复合索引,
游戏场。Value
听起来很合理:

db.collection.ensureIndex({ "Playfields.ID": 1, "Playfields.Value": 1 })
但是。。。任何指数的创建都应该伴随一些实证检验。使用
explain()
运行您的查询,以了解您的索引是否实际被选中,如果是,它的选择性有多高:

db.playfieldvalues.find({ "playfields": { $elemMatch: { ID: "Play.NHL.NHLEventX", Value: -47 } } })
    .explain()
“解释文件”的内容有很多细节,但首先要检查的是:

  • 选择了什么索引(如果有的话)
  • 检查的钥匙数量
  • 检查的文档数
粗略地说,“检查的关键点”越接近返回的文档数量,索引覆盖率就越高

如果MongoDB没有选择您的索引,那么您应该查看解释计划提供的关于被拒绝计划的详细信息,以及拒绝计划的原因


还有一个问题是索引的成本(就对写入时间和索引存储的影响而言),因此我建议考虑您的非功能性需求—在没有专用索引的情况下,是否可以实现所需的运行时间?如果没有,那么您应该继续进行实证测试,但要准备根据
explain()
输出告诉您的内容调整您的选择。

对于某些查询,milti-key复合索引看起来工作正常。添加索引后,db.collection.ensureIndex({“Playfields.ID”:1,“Playfields.Value”:1})以下查询运行得更快:db.playfieldvalues.find({Playfields:{$elemMatch:{ID:{ID:{Play.NHL.NHLEventX,Value:58}}}])以下带有逻辑运算符的查询运行得非常慢:db.playfieldvalues.find({$and:[{{Playfields:{$elemMatch ID:“Play.NHL.NHLEventY”,value:-38}},{playfields:{$elemMatch:{ID:“Play.NHL.NHLEventX”,value:58}}}}}}]})的确……您应该继续进行实证测试,但要准备根据explain()输出告诉您的内容调整您的选择。