mongo操作速度:数组$ addToSet / $ pull vs object $ set / $ unset

时间:2015-09-16 16:09:01

标签: mongodb

我有一个包含大量术语的index集合,以及一个包含来自其他集合的标识符的字段items。目前该字段存储了一个文档数组,文档由$addToSet添加,但我有一些性能问题。似乎$unset操作执行得更快,因此我计划将文档数组更改为嵌入文档的文档。

我是否认为$ set / $ unset字段比推/拉嵌入文档更新?

修改

  

经过小测试后,我们看到设置/未设置的速度提高了4倍。在另一   如果我使用对象而不是数组,那么计算起来就有点难了   属性的数量(与数组的长度相比),我们是   数不胜数。但我们可以考虑每次都使用$set   添加一个包含项目数的字段。

这是当前索引的文件:

{
  "_id": ObjectId("5594dea2b693fffd8e8b48d3"),
  "term": "clock",
  "nbItems": NumberLong("1"),
  "items": [
    {
      "_id": ObjectId("55857b10b693ff18948ca216"),
      "id": NumberLong("123")
    }
    {
      "_id": ObjectId("55857b10b693ff18948ca217"),
      "id": NumberLong("456")
    }
  ]
}

频繁的更新操作是: *删除项目:{$pull:{"items":{"id":123}}} *添加项目:{$addToSet:{"items":{"_id":ObjectId("55857b10b693ff18948ca216"),"id":123,}}} *如果表现更好,我可以将$addToSet更改为$push并检查重复项

这就是我打算做的事情:

{
  "_id": ObjectId("5594dea2b693fffd8e8b48d3"),
  "term": "clock",
  "nbItems": NumberLong("1"),
  "items": {
    "123":{
      "_id": ObjectId("55857b10b693ff18948ca216")
    }
    "456":{
      "_id": ObjectId("55857b10b693ff18948ca217")
    }
  }
}

*删除项目:{$unset:{"items.123":true} *添加项目:{$set:{"items.123":{"_id":ObjectId("55857b10b693ff18948ca216"),"id":123,}}}

有关信息,这些操作是用pymongo进行的(或者如果有充分的理由可以用php完成),但我不认为这是相关的

1 个答案:

答案 0 :(得分:1)

与任何性能问题一样,有很多因素可以解决这样的问题,例如索引,需要点击磁盘等等。

话虽这么说,我怀疑你可能是正确的,因为添加新字段或从MongoDB文档中删除旧字段比从数组中追加/删除要快一些,因为数组类型在搜索时不太容易遍历重复。