2012-11-07 64 views
0

我一直在向現有文檔中添加一個新字段。在MongoDB文檔中添加一個新字段

以下是我的程序AddNewField用於測試目的。

之後的代碼,你可以看到我的集合有兩個文件:第一個是更新前,第二個是更新後。

第一個(Update之前)是包含所有字段的原始文檔。 最後(後更新)僅具有「_id」字段和「new_field」

最後但並非最不重要的,我注意到,雖然第一文檔具有「_id」:物件(「509a2d81f10a00000000000a」) 最後文件有「_id」:「509a2d81f10a00000000000a」

我想使用特殊更新操作符$設置。

我在做什麼錯了?

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!" 
} 

回答

2

問題是OID是一個字符串。當您使用upsert = true進行更新時,不存在具有_id =「509a2d81f10a00000000000a」(字符串)的文檔,因此將使用您提供的_id創建新文檔。在以這種方式使用它之前,您需要將OID轉換爲ObjectID。

相關問題