【问题标题】:The dollar ($) prefixed field '$oid' in 'features.0._id.$oid' is not valid for storage'features.0._id.$oid' 中的美元 ($) 前缀字段 '$oid' 对存储无效
【发布时间】:2020-05-24 08:18:13
【问题描述】:

我在下面附上了以下 Mongo 集合。 它是现有的,不是创建的新集合,我正在尝试在 features 数组中推送新项目,但由于以下错误,我无法实现:美元 ($) 前缀字段 '$oid' in 'features.0._id.$oid' 对存储无效。 使用这个脚本:

db.getCollection("test").update({ _id: "RYB0001" },
{
  $push: {
    "features": {
      "_id": {
          "$oid": ObjectId(),
      },
      "featureItems": [],
      "typeId": "type3"
    }
   }
});

如果是驱动程序版本问题,我可以采取任何解决方法将新项目推送到当前集合吗? MongoDb 版本:4.0.4 Mongo Collection screenshot

【问题讨论】:

  • 文档请不要粘贴图片,请使用格式化文本。
  • MongoDB 中的字段名称 ($oid) 不得以美元符号开头。试试oid。见Restrictions on Field Names
  • "_id": ObjectId() 怎么样?如果已经放入 objectid 对象,为什么还需要$oid 编码语法?
  • @WerfriedDomscheit,目前该集合具有该格式的数据,只需在特征数组中推送一个新项目。有这个 $oid 就像屏幕截图中的那个一样,我尝试使用 oid: ObjectId 但仍然得到同样的错误。
  • 如果当前数据有$oid,那么我强烈建议您迁移数据以使用不带 $ 的字段 - 这样可以节省很多问题。

标签: mongodb mongodb-query mongoid


【解决方案1】:

$oid 符号是MongoDB's Extended JSON 的一部分。我假设您的数据库中的数据实际上没有该键值对,并且仅在使用 JSON.stringify(obj) 之类的东西后才以这种方式表示

> db.test.find({});
{ "_id" : "RYB0001", "features" : [ { "_id" : ObjectId("5e40d46a97abdef3faa0d5d9"), "featureItems" : [ ], "typeId" : "type3" } ] }
> JSON.stringify(db.test.find({})[0]);
{"_id":"RYB0001","features":[{"_id":{"$oid":"5e40d46a97abdef3faa0d5d9"},"featureItems":[],"typeId":"type3"}]}

您需要使用其构造函数 "_id": new ObjectId() 生成一个新的 ObjectId,注意那里的 new 关键字,我认为 @Thilo 可能在他们的评论中错过了这一点。

db.getCollection("test").update({ _id: "RYB0001" },
{
  $push: {
    "features": {
      "_id": new ObjectId(),
      "featureItems": [],
      "typeId": "type3"
    }
   }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 2019-12-27
    • 2023-03-27
    • 2017-12-13
    • 1970-01-01
    相关资源
    最近更新 更多