【发布时间】:2021-04-10 04:08:02
【问题描述】:
我正在使用 Mongo 4.1,并且想更新一个名为“location_copy”的集合,方法是向它添加一个名为“time”的对象类型的新字段,其中包含两个子字段:“utcTime”,它将由该文档“时间”字段的值和“tz”,它将由数据库中“主题”集合中文档的“subject.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”,那么一切都会如您所愿。 谁能帮我完成我的打算?因为这个脚本只打算执行一次,所以性能不是什么大问题。
谢谢!
【问题讨论】:
标签: javascript mongodb