Mongodb:聚合后更新集合

时间:2018-02-08 05:13:12

标签: mongodb mongodb-query aggregation-framework

我执行一个聚合,输出是2个新字段。

db.Messages.aggregate(
[
    {$match : {
        "Payload": /(([1-2]?[0-9])-([0-9]*)-([0-9]*)-([0-9]*)-([0-9]*)-([0-9]*)-([0-9]*))/}
       },...
{
    $out : "tmp_Messagess"  // create new Collection
} 

使用$ out 我已将2个新字段插入名为 tmp_Messagess 的新集合中。插入后我用新集合更新了旧集合:

var bulkOps = db.tmp_Messagess.find().map(function (doc) {
   return {
        "updateOne": {
            "filter": {"_id" : doc._id},
            "update": { "$set": {"BusinessCode" : doc.BusinessCode , "Domain" : doc.Domain}} 
        }
   }
});

db.Messages.bulkWrite(bulkOps, { "ordered": true });

以这种方式更新,它很长。因为我必须运行2个重度查询。首先在聚合后创建新集合,然后使用新集合中的文档更新旧集合。

有什么方法可以直接更新我的聚合命令中的主要集合,或者我必须使用我在这篇文章中提到的旧方法?

1 个答案:

答案 0 :(得分:0)

我分别创建了两个名为test1和test2的样本集合,

//this is my fist collection
db.test1.insert({"fullName": "Srikar Jammi","uname": "srikarjammi"});
db.test1.insert({"fullName": "Viswa Pradeep","uname": "vpradeep"});

//this is my second collection
db.test2.insert({"fullName": "Srikar Jammi","uname": "srikarjammi", 
"age":24, "city": "Hyderabad"});
db.test2.insert({"fullName": "Viswa Pradeep","uname": "vpradeep", 
"age":28, "city": "Guntur"});

现在我想从集合中获取数据(test2:因为它有其他不在test1中的键),一个是uname(这是两个集合中的公共键)。所以,你可以这样做。,

result = db.test2.find({}).map(function(a){return a});
//output
[
{
    "_id" : ObjectId("5a7c072742f432f35421f931"),
    "fullName" : "Srikar Jammi",
    "uname" : "srikarjammi",
    "age" : 24,
    "city" : "Hyderabad"
},
{
    "_id" : ObjectId("5a7c072b42f432f35421f932"),
    "fullName" : "Viswa Pradeep",
    "uname" : "vpradeep",
    "age" : 28,
    "city" : "Guntur"
}
]

现在结果保存了第二个集合的数据(test2)。最后我必须用相应的键(年龄,城市)来更新集合。

finalRes = result.forEach(
function (elem) {
    db.test1.update({
        "uname": elem.uname
    },
    {
            $set: {
                "age": elem.age,
                "city":elem.city
            }
        }
    )
    }
);

最后(db.test1.find({}); )通过这个你找到带有更新密钥(年龄,城市)的集合一(test1)

如果我错了或者任何解决方案都非常感激,请纠正我。 感谢