javascript - 从不同的数据库更新集合
问题描述
我正在使用 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”,那么一切都会如您所愿。谁能帮我完成我的打算?因为这个脚本只打算执行一次,所以性能不是什么大问题。
谢谢!
解决方案
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/。
推荐阅读
- java - spring-boot-starter-web 和 spring-boot-starter-webflux 不能一起工作吗?
- c# - 缩放后未重新计算质心
- javascript - 获取存储在解析服务器上的图像文件
- python - 将 ctypes c_void_p 转换为 C 输出参数
- c# - 无效的列名 asp
- html - Bootstrap 4 nav-tabs 打开时的下拉菜单颜色
- angular - PrimeNG 基于对象数组的预选复选框
- ios - 使用不同的数据重定向到相同的 UIViewController?
- android - 更新承载可绘制对象的 onTouchEvent ImageView 类中的缩放参数
- mysql - SQL按月和年选择日期范围