Aditya Joshi
Aditya Joshi

Reputation: 1053

How to improve the performance of query in mongodb?

I have a collection in MongoDB with more than 5 million documents. Whenever I create a document inside the same collection I have to check if there exists any document with same title and if it exists then I don't have to add this to the database.

Example: here is my MongoDB document:

{
"_id":ObjectId("3a434sa3242424sdsdw"),
"title":"Lost in space",
"desc":"this is description"
}

Now whenever a new document is being created in the collection, I want to check if the same title already exists in any of the documents and if it does not exists, then only I want to add it to the database.

Currently, I am using findOne query and checking for the title, if it not available only then it is added to the database. I am facing the performance issue in this. It is taking too much time to do this process. Please suggest a better approach.

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

Upvotes: 1

Views: 214

Answers (1)

Gibbs
Gibbs

Reputation: 22956

You can reduce the network round trip time which is currently 2X. Because you execute two queries. One for find then one for update. You can combine them into one query as below.

db.collection.update(
   <query>,
   { $setOnInsert: { <field1>: <value1>, ... } },
   { upsert: true }
)

It will not update if already exists.

db.test.update(
   {"key1":"1"},
   { $setOnInsert: { "key":"2"} },
   { upsert: true }
)

It looks for document with key1 is 1. If it finds, it skips. If not, it inserts using the data provided in the object of setOnInsert.

Upvotes: 1

Related Questions