【问题标题】:Add a new field to a MongoDB document向 MongoDB 文档添加新字段
【发布时间】:2012-10-27 09:01:19
【问题描述】:

我无法在现有文档中添加新字段。

以下是我的程序 AddNewField 用于测试目的。

代码之后你可以看到我的收藏有两个文档:第一个是更新前,第二个是更新后。

第一个(更新之前)是包含所有字段的原始文档。 最后一个(更新后)只有“_id”字段和“new_field”

最后但并非最不重要的一点是,我注意到虽然第一个文档有“_id”:ObjectId("509a2d81f10a00000000000a") 最后一个文档有“_id”:“509a2d81f10a00000000000a”

我正在尝试使用特殊的更新运算符 $set。

我做错了什么?

procedure AddNewField(const aGfs: TGridFS; const  aGfsName: string);
var
  command: IBson;
  bb: IBsonBuffer;
  query: IBson;
  gf: IGridfile;
  OID: string;
begin
  gf := aGfs.find(aGfsName, False);

  OID := gf.getID().AsString;
  query := BSON(['_id', OID]);

  bb := NewBsonBuffer;
  bb.startObject(PAnsiChar('$set'));
  bb.AppendStr(PAnsiChar('new_field'), PAnsiChar('The Boss wins!'));
  bb.finishObject;
  command := bb.finish;

  FMongo.update('fsdb.fs.files', query, command, updateUpsert);
end;

在调用 FMongo.Update 之后,我的收藏现在有两个文档!

/* Before Update */
{
  "_id" : ObjectId("509a2d81f10a00000000000a"),
  "filename" : "Test Document.pdf",
  "length" : NumberLong(7855753),
  "chunkSize" : 262144,
  "uploadDate" : ISODate("2012-11-07T09:44:33Z"),
  "md5" : "e803de3a59bf7098bb419e005162e950",
  "flags" : 0
}

/* After Update */
{
  "_id" : "509a2d81f10a00000000000a",
  "new_field" : "The Boss wins!"
}

【问题讨论】:

    标签: mongodb pascal


    【解决方案1】:

    问题在于 OID 是一个字符串。当您使用 upsert = true 进行更新时,不存在 _id = "509a2d81f10a00000000000a"(字符串)的文档,因此使用您提供的 _id 创建一个新文档。以这种方式使用之前,您需要将 OID 转换为 ObjectID。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-04
      • 2023-02-14
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 2012-04-22
      • 1970-01-01
      相关资源
      最近更新 更多