gpt4 book ai didi

mongodb - 在 mongodb 中转换集合的内存有效方法

转载 作者:可可西里 更新时间:2023-11-01 09:35:27 25 4
gpt4 key购买 nike

我在 mongodb 中有这样的集合:

{
"_id" : ObjectId("56a5f47ed420cf0db5b70242"),
"tag" : "swift",
"values" : [
{
"word" : "osx",
"value" : 0.02
},
{
"word" : "compiler",
"value" : 0.01
}
]
},
{
"_id" : ObjectId("56a5f47ed420cf0db5b70243"),
"tag" : "c++",
"values" : [
{
"word" : "namespace",
"value" : 0.04
},
{
"word" : "compiler",
"value" : 0.05
}
]
}

我需要像这样在集合中转换它:

{
"_id" : ObjectId("56a5f4e5d420cf0db5b70247"),
"word" : "namespace",
"values" : [
{
"tag" : "c++",
"value" : 0.04
}
]
},
{
"_id" : ObjectId("56a5f4e5d420cf0db5b70248"),
"word" : "compiler",
"values" : [
{
"tag" : "swift",
"value" : 0.01
},
{
"tag" : "c++",
"value" : 0.05
}
]
},
{
"_id" : ObjectId("56a5f4e5d420cf0db5b70249"),
"word" : "osx",
"values" : [
{
"tag" : "swift",
"value" : 0.02
}
]
}

我刚开始使用 mongodb 和 MapReduce,有一些问题:

  1. 在我的情况下,我应该将 MapReduce 或聚合框架与 $out 一起使用到另一个集合吗?
  2. 哪种方法的内存效率更高?因为集合很大 (3gb) 而我只有 8gb 的 RAM,所以我担心会出现 OutOfMemory 错误。
  3. 如果我要使用 MapReduce,map 和 reduce 阶段应该做什么?我应该在 map 阶段发出 {"word": word, "values": {"tag":tag, "value": value} } 之类的项目并将其合并到 reduce 状态?

最佳答案

使用 .aggregate()方法。

您需要使用 $unwind 对“值”数组进行反规范化运算符(operator)。管道的最后阶段是 $group按“values.word”对文档进行分组并使用 $push 的阶段累加器运算符返回每个组的子文档数组。

从那里,您可以使用 "bulk" 将文档插入到新集合中操作。

var bulk = db.myCollection.initializeOrderedBulkOp();
var count = 0;
db.collection.aggregate( [
{ "$unwind": "$values" },
{ "$group": {
"_id": "$values.word",
"values": {
"$push": { "tag": "$tag", "value": "$values.value" }
}
} }
]).forEach(function(doc) {
bulk.insert( { "word": doc._id, "values": doc.values } );
count++;
if ( count % 1000 === 0 ) {
// Execute per 1000 operations and re-init
bulk.execute();
bulk = db.myCollection.initializeOrderedBulkOp();
}
});
// Clean up queues
if (count > 0 ) {
bulk.execute();
}

关于mongodb - 在 mongodb 中转换集合的内存有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34979526/

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