我执行一个聚合,输出是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个重度查询。首先在聚合后创建新集合,然后使用新集合中的文档更新旧集合。
有什么方法可以直接更新我的聚合命令中的主要集合,或者我必须使用我在这篇文章中提到的旧方法?
答案 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)
如果我错了或者任何解决方案都非常感激,请纠正我。 感谢