我有一个大型数据集,其中的文档有时会相互交叉引用,有时则不会。在我基于这些交叉引用进行mapreduce之前,我必须为交叉引用中的每个值设置交叉引用数组。
我在shell函数中使用它来合并这些数组:
function fixArray2() {
var counter = 0;
// I only want the xref for each field, I don't even want the id
var cursor = db.catalog.find({}, {xref: true, _id: false});
// I don't want to init this inside the loop, worried about memory leaks
var consolidatedArray = [];
while (cursor.hasNext()) {
var xref1 = cursor.next().xref;
// first pass: create a consolidated array when the cross references match
var limitedCursor1 = db.catalog.find({"name":{$in:xref1}});
while (limitedCursor1.hasNext()) {
var doc1 = limitedCursor1.next();
consolidatedArray = consolidatedArray.concat(doc1.xref);
}
consolidatedArray = consolidatedArray.unique();
// now that we have the consolidated array, reset the xref field of the object to it
for (var i=0; i<consolidatedArray.length; i++) {
db.catalog.update({name:consolidatedArray[i]},{$set:{xref: consolidatedArray}},false, true);
}
consolidatedArray.length = 0;
counter++;
if (counter % 1000 == 0) {
print("Processed " + counter + " documents.");
}
}
}
它有效,但我必须经常运行它。有人可以建议改进吗?
答案 0 :(得分:1)
如果您在将文档写入集合时预先进行工作,则可以避免在以后进行工作的地方进行缩减。
因此,获取应交叉引用的文档列表,并在插入时将其与文档一起写入。例如,在删除文档或不再引用其他文档时,根据需要进行更新。