我有一个网络域名数据库,数据如下:
{"_id": "es.wikipedia.org"}
{"_id": "en.wikipedia.org"}
我想(尝试)插入可能已经在集合中的域名,如“stackoverflow.com”或“es.wikipedia.org”,因此如果文档不在数据库中,请插入,但如果它是,然后只是跳过,什么都不做。但我不能在一次手术中做到这一点。如果我一起去
collection.insert(new Document("_id", "es.wikipedia.org"));
如果文档已存在于集合中,则它会失败并出现异常。如果我尝试更新,就像这样:
collection.updateOne(new Document("_id", "es.wikipedia.org"), new Document("$set", new Document()), new UpdateOptions().upsert(true));
它失败,因为$set
字段为空。但它只是一个列表,它(目前)没有比“_id”更多的字段。有没有办法做到这一点?我犯了错误吗?
答案 0 :(得分:0)
您需要查明具有该ID的记录是否存在DB,然后您可以进行进一步处理。
var res = db.user.find({"_id": "es.wikipedia.org"});
if(res.length()){
db.user.insert({"_id": "es.wikipedia.org"});
}
答案 1 :(得分:0)
如果您使用的是2.6或更高版本的MongoDB版本,请使用insert()方法,并将ordered选项设置为false。将选项设置为false将导致尝试插入带有重复键的文档时出现异常,但是要插入的其余文档将继续被处理(并插入,如果它们不是重复的。)请参阅此文章:
https://docs.mongodb.org/manual/reference/method/db.collection.insert/
...并注意关于无序插入的部分。
如果您使用的是MongoDB版本3.2.x,则还可以使用insertMany()方法执行文档数组的无序插入。将ordered选项设置为false将导致尝试插入具有重复键的文档的异常,但阵列中的所有新文档都将添加到集合中。看到这篇文章:
https://docs.mongodb.org/manual/reference/method/db.collection.insertMany/
...并注意关于无序插入的部分。