gpt4 book ai didi

mongodb - 优化 Mongodb 文档版本控制

转载 作者:可可西里 更新时间:2023-11-01 10:37:07 27 4
gpt4 key购买 nike

在我的应用程序中,我需要加载大量数据并将其与特定集合中的现有文档进行比较,并对它们进行版本控制。

为了做到这一点,对于我必须插入的每个新文档,我简单地查询并搜索最新版本,使用特定键(不是 _id),将数据组合在一起并找到最新版本。

数据示例:

{
"_id" : ObjectId("5c73a643f9bc1c2fg4ca6ef5"),
"data" : {
the data
}
},
"key" : {
"value1" : "545454344",
"value2" : "123212321",
"value3" : "123123211"
},
"version" : NumberLong("1"),
}

如您所见,键由三个值组成,与数据相关,我查找最新版本的查询如下:

db.collection.aggregate(
{
{
"$sort" : {
"version" : NumberInt("-1")
}
},
{
"$group" : {
"_id" : "$key",
"content" : {
"$push" : "$data"
},
"version" : {
"$push" : "version"
},
"_oid" : {
"$push" : "$_id"
},
}
},
{
"$project" : {
"data" : {
"$arrayElemAt" : [
"$content",
NumberInt("0")
]
},
"version" : {
"$arrayElemAt" : [
"$version",
NumberInt("0")
]
},
"_id" : {
"$arrayElemAt" : [
"$_oid",
NumberInt("0")
]
}
}
}
}
)

为了提高性能(从指数级到线性级),我构建了一个包含键和版本的索引:

db.getCollection("collection").createIndex({ "key": 1, "version" : 1}) 

所以我的问题是:还有其他一些功能/策略可以优化此搜索吗?

注意事项

  • 在这些集合中还有一些其他字段我已经使用匹配来过滤数据,为简洁起见省略
  • 我的先决条件是加载大量数据,一对一处理,然后插入:如果有更好的计算版本的方法,我也可以考虑更改此
  • 我不确定 unique index on key 可以和我的查询一样。我的意思是,如果我在键和版本上做一个唯一索引,我可以对那对夫妇进行迭代,例如:
    • 没有收集数据:只插入第一个版本
    • 插入新文档:尝试插入版本 1,然后出现错误,对其进行迭代,这应该命中唯一索引,对吗?

最佳答案

我遇到过类似的情况,我就是这样解决的。

  • 创建一个单独的集合来保存 Key 和相应的最新版本,比如 KeyVersionCollection
    • 将此集合设为“InMemory”以加快响应速度
    • 将 key 存储在“_id”字段中
  • 在版本化集合中插入文档时,说 EntityVersionedCollection

这将节省聚合和排序的时间。在旁注中,我会将最新版本保留在单独的集合中 - EntityCollection。在这种情况下,对于每个实体 - 在 EntityVersionedCollection 中插入一个新版本并将其更新插入到 EntityCollection 中。

在极端情况下,在插入实体时获取新版本号和使用它之间的过程被中断,您可能会看到版本在 EntityVersionedCollection 中被跳过;但那应该没问题。使用时间戳来跟踪插入/更新,以便将来可以将其用于关联/审计。

希望对您有所帮助。

关于mongodb - 优化 Mongodb 文档版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54881257/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com