简体   繁体   中英

Simple MongoDB query slow

I am new to MongoDB. I am trying to write some data to a Mongo database from Python script, the data structure is simple:

{"name":name, "first":"2016-03-01", "last":"2016-03-01"}

I have a script to query if the "name" exists, if yes, update the "last" date, otherwise, create the document.

if db.collections.find_one({"name": the_name}):

And the size of data is actually very small, <5M bytes, and <150k records.

It was fast at first (eg the first 20,000 records), and then getting slower and slower. I checked the analyzer profile, some queries were > 50 miliseconds, but I don't see anything abnormal with those records.

Any ideas?

Update 1:

Seems there is no index for the "name" field:

> db.my_collection.getIndexes()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "domains.my_collection"
    }
] 

First, you should check if the collection has an index on the "name" field. See the output of the following command in mongo CLI.

db.my_collection.getIndexes();

If there is no index then create it (note, on production environment you'd better create index in background).

db.my_collection.createIndex({name:1},{unique:true});

And if you want to insert a document if the document does not exist or update one field if the document exists then you can do it in one step without pre-querying. Use UPDATE command with upsert option and $set/$setOnInsert operators (see https://docs.mongodb.org/manual/reference/operator/update/setOnInsert/ ).

db.my_collection.update(
    {name:"the_name"},
    {
      $set:{last:"current_date"}, 
      $setOnInsert:{first:"current_date"}
    },
   {upsert:true}
 );

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM