2014-03-05 48 views
0

這裏下面是一個假設的Users集合,其中多個地址被允許:的MongoDB:如何更新陣列的複合項目,確保不重複

{ 
    "firstName": "Joe", 
    "lastName": "Grey", 
    ... 
    "addresses": 
    [ 
    { 
     "name": "Default", 
     "street": "..." 
     ... 
    }, 
    { 
     "name": "Home", 
     "street": "..." 
     ... 
    }, 
    { 
     "name": "Office", 
     "street": "..." 
     ... 
    } 
    ] 
} 

每個地址都有一個名字......這應該是獨特的–例如不能有兩個地址默認。如果我想更新,我們假設索引1處的地址(首頁),如何確保更新數據不包含名稱默認Office

我猜兩步方法(即find然後update)不會是非常正確的,因爲數據可能會在find和隨後update操作之間進行更新,是不是?

+0

您想要在索引1上更新的屬性,或者您想用新的json替換索引1。 – Sumeet

+0

我想更新名稱屬性......並且新名稱*必須*不同於數組中其他地址的名稱(示例中的索引0和2)。 – j3d

回答

1
var renamed = 'Office'; // from user input 
var users = getUserMongoCollection();  

users.update({_id:userId, 'addresses.name': { $ne : renamed } }, 
    { $set : { 'addresses.1.name' : renamed } }, function(err){ 
     //all done! 
    }); 

按ID查找記錄,只有在數組不包含新名稱時才更新。