1

既存のドキュメントに新しいフィールドを追加することに行き詰まっています。

以下は、テスト目的の AddNewField 手順です。

コードの後、私のコレクションには 2 つのドキュメントがあることがわかります。1 つ目は更新前、2 つ目は更新後です。

1 つ目 (更新前) は、すべてのフィールドを含む元のドキュメントです。最後の (更新後) には、「_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 を呼び出した後、私のコレクションには 2 つのドキュメントがあります。

/* 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!"
}
4

1 に答える 1

2

問題は、OID が文字列であることです。upsert = true で更新を行うと、_id = "509a2d81f10a00000000000a" (文字列) のドキュメントは存在しないため、指定した _id で新しいドキュメントが作成されます。この方法で使用する前に、OID を ObjectID に変換する必要があります。

于 2012-11-07T12:18:08.170 に答える