2013-07-24 274 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