首页 > 解决方案 > 从不同的数据库更新集合

问题描述

我正在使用 Mongo 4.1 并希望更新一个名为“location_copy”的集合,方法是向其添加一个名为“time”的对象类型的新字段,其中包含两个子字段:“utcTime”,它将由该值填充文档“时间”字段和“tz”,它将由数据库“主题”中的集合“主题”中的文档的“主题.contactInf[0].addresses[0].timeZoneID”的值填充(与第一个集合不同的数据库),其中“_id”字段值对应于locations_copy中的“subjectID”字段。

我尝试使用以下代码来完成此操作:

const get_time_zone_id = function(doc) {return doc.contactInfo[0].addresses[0].timeZoneID}
const get_location_doc = function(subjectID) {    return db.getSiblingDB('Subjects').subjects.find({"_id": subjectID, "contactInfo": {"$exists": true}, "$where" : function() {

   return (this.contactInfo.length > 0 && this.contactInfo[0].addresses && this.contactInfo[0].addresses.length > 0 && this.contactInfo[0].addresses[0].timeZoneID)
}}, {"contactInfo" : {"$slice": 1}, "contactInfo.addresses": {"$slice": 1},"contactInfo.addresses.timeZoneID" : 1}).map(get_time_zone_id)}

db.locations_copy.aggregate( [
   { $match: {"subjectID": {"$exists": true}}},
   { $addFields: {
       time: { utc: "$timeUTC",
               tz: { "$arrayElemAt": [get_location_doc(ObjectId("$subjectID")), 0 ] }}
       
     }
   }
] ).forEach(function(x){db.locations_copy.save(x)})

一切正常,除了一件事:当我尝试将 ObjectId("$subjectID") 作为参数传递给“get_location_doc”时,它会将“$subjectID”解析为文字字符串,而不是传递每个文档中基础字段的值。我也尝试过简单地传递 subjectID(不带引号),在这种情况下它只是未定义的,或者 "$$subjectID" 导致我再次进入文字字符串。我知道这是由于运行时的客户端/服务器端解析。我曾尝试使用“$function”运算符,但显然它仅适用于 4.4 版(我使用的是 4.1)。我应该注意,如果我用硬编码的字符串 ID(例如“5ff4c037bc0a716381231277”)替换“$subjectID”,那么一切都会如您所愿。谁能帮我完成我的打算?因为这个脚本只打算执行一次,所以性能不是什么大问题。

谢谢!

标签: javascriptmongodb

解决方案


db.getSiblingDB().collection.find()是客户端操作。作为查询的一部分,您不能使用它来连接集合。为此,请参阅https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

您要做的第二件事是从文档中检索嵌套字段。您可以使用 $set 和点符号来做到这一点。具体参见https://docs.mongodb.com/manual/reference/operator/aggregation/set/#adding-fields-to-an-embedded-document中的示例。

您将需要构建一个聚合管道,该管道仅使用https://docs.mongodb.com/manual/reference/operator/aggregation/中记录的操作和https中记录的阶段来完成当前聚合和 javascript 组合所做的所有事情://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/


推荐阅读