使用 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
进行匹配。如果它存在,它什么都不做,否则它插入它。
我是一个 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
进行匹配。如果它存在,它什么都不做,否则它插入它。