2012-11-07 57 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。

相关问题