我在MongoDB中有一个集合,其中包含超过500万个文档。每当我在同一集合中创建文档时,我都必须检查是否存在任何具有相同标题的文档,如果存在,则不必将其添加到数据库中。
示例:这是我的MongoDB文档:
{
"_id":ObjectId("3a434sa3242424sdsdw"),
"title":"Lost in space",
"desc":"this is description"
}
现在,无论何时在集合中创建一个新文档,我都想检查是否所有文档中都已经存在相同的 title ,如果不存在,那么我只想添加它到数据库。
当前,我正在使用 findOne 查询并检查标题,如果仅不可用,则将其添加到数据库中。我在此面临性能问题。完成此过程需要太多时间。请提出一个更好的方法。
async function addToDB(data){
let result= await db.collection('testCol').findOne({title:data.title});
if(result==null){
await db.collection('testCol').insertOne(data);
}else{
console.log("already exists in db");
}
}
答案 0 :(得分:1)
您可以将network round trip time
减小为当前的2倍。因为您执行两个查询。一个用于查找,然后一个用于更新。您可以将它们组合为一个查询,如下所示。
db.collection.update(
<query>,
{ $setOnInsert: { <field1>: <value1>, ... } },
{ upsert: true }
)
如果已经存在,它将不会更新。
db.test.update(
{"key1":"1"},
{ $setOnInsert: { "key":"2"} },
{ upsert: true }
)
它将查找key1
为1的文档。如果找到,它将跳过。如果没有,它将使用setOnInsert
对象中提供的数据进行插入。