2013-07-24 121 views
1

我正在使用ObjCMongoDB作为访问mongoDB的可可包装器。我遇到了一个难题,那就是我必须找到并用新文档替换文档。任何人都可以通过指出要使用的ObjCMongoDB的代码/ API来帮助我。如何更新文档,将其替换为mongoDB集合中的新文档

例如:

{ 
"_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]; 

在我收藏之前n将有这样的文档:

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

上面的代码完美地工作,创建谓词时字符串中有额外的空间。 –

回答

1

如果将值保持相同,你只需重命名键:

  • -[MongoUpdateRequest keyPath:renameToKey:]

但由于观念正在转变,你应该正好被清除旧的密钥设置新的一个。

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

正如我上面提到的,你可以用一个单一的更新请求做到这一点。

+0

你可以再看看这个问题,我已经编辑过它。 –

+1

里程碑的字符串与您的示例数据不匹配,它在发布之前有一个额外的空间。要向数组添加值,请改用-arrayForKeyPath:appendValuesFromArray:。究竟发生了什么?结果的值和connectionError是什么? – paulmelnikow

+0

基本上在我的收藏中,我有很多关键文档:值。在更新中,我不想检查文档中的每个字段并编写查询来更新文档。相反,我想用可能有一些新键的更新文档替换文档:增加或删除了值。希望我清楚这一次:) BOOL结果将是YES,但数据库没有得到更新。 –

0

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

+0

第一句是的;第二句话没有。在Mongo中,您可以使用单个更新请求对文档进行多项更改。 – paulmelnikow