【问题标题】:Updating a collection from a different database从不同的数据库更新集合
【发布时间】: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


    【解决方案1】:

    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://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/ 中记录的阶段来完成当前聚合和 javascript 组合所做的所有事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      • 2011-02-10
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多