既存のドキュメントに新しいフィールドを追加することに行き詰まっています。
以下は、テスト目的の 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!"
}