如何通过将文档替换为mongoDB集合中的新文档来更新文档

时间:2013-07-24 15:08:39

标签: objective-c mongodb objcmongodb

我使用ObjCMongoDB作为访问mongoDB的可可包装器。在我必须使用新文档查找和替换文档的情况下,我遇到了困难。任何人都可以通过指出要使用的ObjCMongoDB的代码/ API来帮助我。

例如:

{
"_id" : { "$oid" : "51de4ed737965b2d233f4862"} ,
"milestone" : "Application 7.1 release" ,
"pendingtasklist" : [ task1 , task2 , task3]
}

这里我必须用新列表替换 pendingtasklist,结果应该是

{
"_id" : { "$oid" : "51de4ed737965b2d233f4862"} ,
"milestone" : "Application 7.1 release" ,
"someotherlist" : [ task12 , task33 , task32]
}

我附上了我用来实现此目的的代码,但没有成功

NSError *connectionError = nil;
MongoConnection *dbConn = [MongoConnection connectionForServer:@"127.0.0.1:27017" error:&connectionError];


MongoDBCollection *collection = [dbConn collectionWithName:@"mydb.milestones"];

MongoKeyedPredicate *predicate = [MongoKeyedPredicate predicate];
[predicate keyPath:@"milestone" matches:@"Application 7.1 release"];

MongoUpdateRequest *updateReq = [MongoUpdateRequest updateRequestWithPredicate:predicate  firstMatchOnly:YES];
NSDictionary *milestoneDict = @{@"problemlist": @[@"12345",@"112244",@"55543",@"009009"],@"milestone":@"Application 7.1 release"};
[updateReq replaceDocumentWithDictionary:milestoneDict];

BOOL result = [collection updateWithRequest:updateReq error:&connectionError];

在我收藏之前会有这样的文件:

{ "_id" : { "$oid" : "51de4ed737965b2d233f4862"} , "milestone" : "Application 7.1 Release" , "problemlist" : [ 12345 , 112244 , 55543]}
{ "_id" : { "$oid" : "51de4ed737965b2d233f4864"} , "milestone" : "Application 7.1 UAT" ,  "problemlist" : [ 33545 , 7654 , 8767]}

2 个答案:

答案 0 :(得分:1)

如果值保持不变,您只需重命名密钥:

  • -[MongoUpdateRequest keyPath:renameToKey:]

但是由于值正在变化,您应该取消设置旧密钥并设置新密钥。

  • -[MongoUpdateRequest unsetValueForKeyPath:]
  • -[MongoUpdateRequest keyPath:setValue:]

正如我上面提到的,您可以使用单个更新请求执行此操作。

答案 1 :(得分:0)

要重命名字段,您需要删除旧字段,然后添加新字段。在这种情况下,您必须为此运行两个单独的查询。