我有一个包含大量术语的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完成),但我不认为这是相关的
答案 0 :(得分:1)
与任何性能问题一样,有很多因素可以解决这样的问题,例如索引,需要点击磁盘等等。
话虽这么说,我怀疑你可能是正确的,因为添加新字段或从MongoDB文档中删除旧字段比从数组中追加/删除要快一些,因为数组类型在搜索时不太容易遍历重复。