【问题标题】:Javascript MongoDB dot notation issue for embedded document嵌入式文档的Javascript MongoDB点符号问题
【发布时间】:2018-02-18 07:22:21
【问题描述】:

我正在使用带有 Javascript 的 MongoDB。我正在尝试声明以下参数:

params = {
  title: title,
  description: description,
  "media.image": image,
  feedUpdated: new Date()
};

然后我使用包含使用 $set 的服务运行查询,如下所示:

collection.update({
    _id: ObjectId(id)
  }, {
    $set: {
      params
    }
  }, function(e, updated) {
    cb(e, updated);
  });

但我收到以下错误:

MongoError:“params.media.image”中的虚线字段“media.image”无效 用于存储。

我认为这个问题是由于通过使用引号声明对象,它将它声明为对象键“media.image”而不是将其保留为字符串。根据 MongoDB $set 文档:

要在嵌入文档或数组中指定 a,请使用点 符号。

https://docs.mongodb.com/manual/reference/operator/update/set/

我可以在技术上手动编写查询以包含“media.image”,但我更愿意在参数中声明它并将其传递给服务。

有什么想法吗?欢迎所有方法!

【问题讨论】:

  • 这是一个 JavaScript 错误。你的意思是$set: params。当您执行$set: { params } 时,它会扩展为应用"params" 作为对象的键名。与写'$set': { 'params': params } 非常相似,这当然是您不想要的。 params 已经是一个对象。你不需要把它包装成一个。
  • 是的,你是对的!谢谢!

标签: javascript mongodb


【解决方案1】:

在使用 MongoDB 时,不允许在键中使用点。我可以建议两种方法:

// #1 camelCase
params = {
  title: title,
  description: description,
  mediaImage: image,
  feedUpdated: new Date()
}

// #2 object
params = {
  title: title,
  description: description,
  media: { image: image },
  feedUpdated: new Date()
}

【讨论】:

  • 要在嵌入文档或数组中指定 ,请使用点表示法。 docs.mongodb.com/manual/reference/operator/update/set
  • 不是问题。 OP 试图明智地做“点符号”的做法是完全有效的。实际的问题是对 JavaScript 语法的误解。
  • 我现在知道了,谢谢。我以为 OP 正在尝试更新 params 字段。
【解决方案2】:

借助 JavaScript,借助 ECMAScript 2015 计算属性名称,您可以通过在相关键周围添加方括号 [] 来使用点表示法。在您的情况下,它将是:

params = {
  title: title,
  description: description,
  ["media.image"]: image,
  feedUpdated: new Date()
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多