【问题标题】:CosmosDB - Invalid BSON field name 'places.$id'CosmosDB - 无效的 BSON 字段名称 'places.$id'
【发布时间】:2017-09-01 19:04:16
【问题描述】:

我在 MongoDB 文档模型上使用 Azure CosmoDB,并且在使用 DBRefs $id 更新某些文档时遇到了奇怪的行为

看看这个脚本示例:

original_id = ObjectId()

db.places.insert({
    "_id": original_id,
    "name": "Broadway Center",
    "url": "bc.example.net"
})

db.people.insert({
    "name": "Erin",
    "places":{"$ref":"places","$id": original_id},
    "url":  "bc.example.net/Erin"
})

db.people.find({"places.$id": original_id}) //works like charm
db.people.update({"places.$id": original_id}, {$set:{"NEW_FIELD": false}}, {multi:true}) //doesn't works =/

然后返回:

Failed to execute script.

Error: Error: error: {
    "_t" : "OKMongoResponse",
    "ok" : 0,
    "code" : 2,
    "errmsg" : "Invalid BSON field name 'places.$id'",
    "$err" : "Invalid BSON field name 'places.$id'"
} :
DBCollection.prototype.update@src/mongo/shell/collection.js:589:23
@(shell):1:1

如果有人知道发生了什么,我真的很感激。

【问题讨论】:

  • 不要使用 DBRef。你真的不应该在任何地方使用它,而且 CosmosDB 显然不支持它。我个人对 DBRef 存储没有弃用通知感到惊讶(实际上惊呆了)。几乎没有任何东西支持它,这首先是一个坏主意。使用标准ObjectId 值和$lookup 检索相关数据。也尝试在没有相关数据的情况下进行建模。或者使用 RDBMS。

标签: mongodb azure azure-cosmosdb


【解决方案1】:

你应该替换

"places":{"$ref":"places","$id": original_id},

"places_id": original_id,

【讨论】:

  • 事实上,我是使用 spring 数据插入这些数据,我无法更改数据在文档中的存储方式。因此,更改 $id 不是一种选择。
  • 更改文档的架构不是一个选项。这只是一个样本。更改查询以更新为非 DBREF 字段可以正常工作,但不能解决我的问题。
猜你喜欢
  • 2021-12-31
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多