如何提高mongodb中查询的性能?

时间:2020-06-27 05:06:37

标签: node.js mongodb mongodb-query

我在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");
 }
}

1 个答案:

答案 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对象中提供的数据进行插入。

相关问题