使用 MongoDB 存储唯一地址

Using MongoDB To Store Unique Address

我是一个 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个地址。

您的更新语法有误。如 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 });

如果是新插入的内容,将 return 如下所示:

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

如果文档已经存在,则执行以下操作:

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

它的作用是将文档与您要插入的文档的 address 进行匹配。如果它存在,它什么都不做,否则它插入它。