简体   繁体   中英

findOneAndUpdate works part of the time. MEAN stack

I'm working with the mean stack I'm trying to update the following object:

{ 
_id : "the id",
fields to be updated....
}

This is the function that does the updating:

function updateById(_id, update, opts){
    var deferred = Q.defer();
    var validId = new RegExp("^[0-9a-fA-F]{24}$");
    if(!validId.test(_id)){
        deferred.reject({error: 'invalid id'});
    } else {
        collection.findOneAndUpdate({"_id": new ObjectID(_id)}, update, opts)
        .then(function(result){
            deferred.resolve(result);
        },
        function(err){
            deferred.reject(err);
        });
    }

    return deferred.promise;
}

This works with some of my objects, but doesn't work with others. This is what is returned when it fails to update:

{
ok: 1,
value:null
}

When the function is successful in updating the object it returns this:

{
lastErrorObject: {}
ok: 1
value: {}
}

It seems like Mongo is unable to find the objects I'm trying to update when it fails. However, I can locate those objects within the Mongo shell using their _id.

Does anybody know why the driver would be behaving this way? Could my data have become corrupt?

Cheers!

I found the answer and now this question seems more ambiguous so I apologize if it was confusing.

The reason I was able to find some of the documents using ObjectID(_id) was because I had manually generated some _id fields using strings.

Now I feel like an idiot but, instead of deleting this question I decided to post the answer just in case someone is running into a similar issue. If you save an _id as a string querying the collection with the _id field changes.

querying collection with MongoDB generated _id s:

 collection.findOneAndUpdate({"_id": new ObjectID(_id)}, update, opts)

querying collection with manually generated _id s:

collection.findOneAndUpdate({"_id": _id}, update, opts)

In the second example _id is a string.

Hope this helps someone!

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