2015-04-29 63 views
1

我是一個使用MongoDB的n00b,希望清理我們的地址數據庫。我們有多個文件可以有相同的地址。所有的地址都被統一格式化,不存在拼寫或縮寫問題,但我一直無法弄清楚如何只在集合中插入唯一地址。使用MongoDB存儲唯一地址​​

db.testing.createIndex({ address: 1 }, { unique: true }); 
db.testing.update(
     {address: 
    { 
     street: "99 Main Street", 
     city: "Boston", 
     zip: "66666" 
    }}, 
     { upsert: true}); 

db.testing.update(
     {address: 
    { 
     street: "99 Main Street", 
     city: "Boston", 
     zip: "66666" 
    }}, 
     { upsert: true}); 

db.testing.update(
     {address: 
    { 
     street: "199 Main Street", 
     city: "Boston", 
     zip: "66666" 
    }}, 
     { upsert: true}); 


db.getCollection('testing').find({}); 

以上應該只輸出2個地址。

回答

1

您的更新語法有誤。語法的更新,作爲解釋here,如下:

db.collection.update(
    <query>, 
    <update>, 
    { 
    "upsert": <boolean>, 
    "multi": <boolean>, 
    "writeConcern": <document> 
    } 
); 

你缺少的部分<query>,這意味着你永遠不會更新匹配任何現有的文件,這意味着重複的地址不插入。相反,如果你執行db.testing.insert({ "address": { "street": "99 Main Street", "city": "Boston", "zip": "66666" }});兩次,你會得到以下錯誤:

WriteResult({ 
    "nInserted" : 0, 
    "writeError" : { 
     "code" : 11000, 
     "errmsg" : "E11000 duplicate key error index: test.testing.$address_1 dup key: { : { street: \"99 Main Street\", city: \"Boston\", zip: \"66666\" } }" 
    } 
}) 

如果要插入一個新的文件而不產生錯誤,但在檢查重複,您可以使用以下(使用mongo shell語法) 。

> var doc = { "address": { "street": "99 Main Street", "city": "Boston", "zip": "66666" }}; 
> db.testing.update(doc, { "$set": doc }, { "upsert": true }); 

,將返回類似下面的,如果它是一個新的插入:

WriteResult({ 
    "nMatched" : 0, 
    "nUpserted" : 1, 
    "nModified" : 0, 
    "_id" : ObjectId("55418381819bc7aeea60f83a") 
}) 

或者以下,如果該文件已經存在:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 }) 

它的作用是一致的用你想插入的文件的address文件。如果存在,它不會執行任何操作,否則會插入它。

+0

如果不存在,我該如何獲取它,否則跳過而不拋出錯誤? – Brad

+0

將該場景添加到答案中。 –