Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NodeJS and MongoDB FindAndModify() need remove or update

im trying to do a findAndModifiy in mongodb with nodejS, This is my code:

var nextBill = function (db, success, log) {
    var collection = db.collection('autoincrements');
    log.debug('autoIncrementRepository', 'nextBill');
    var result = collection.findAndModify({
        query: { _id: 'auto' },
        update: { $inc: { bill: 1 } },
        new: true
    });

    success(result.bill);
};

EDIT:

Try with callback

collection.findAndModify({
        query: { _id: 'auto' },
        update: { $inc: { bill: 1 } },
        new: true
    }, function (e, result) {
        success(result.budget);
    });

But give me the error need remove or update..But im doing it..

like image 969
colymore Avatar asked Jun 20 '14 10:06

colymore


3 Answers

The .findAndModify() method in the node native driver implementation is different from the mongo shell implementation. To do an update as above you do:

collection.findAndModify(
   { "_id": "auto" },
   { "$inc": { "bill": 1 } },
   function(err,doc) {
     // work here

   }
);

Oddly somewhat to remove you specify in options so the same would "remove" the matched document:

collection.findAndModify(
   { "_id": "auto" },
   { "$inc": { "bill": 1 } },
   { "remove": true },
   function(err,doc) {
     // work here

   }
);

The main difference being you do not name the "key" sections for the actions.

like image 115
Neil Lunn Avatar answered Sep 19 '22 14:09

Neil Lunn


http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#findAndModify

This above document specifies that the second parameter is the sort order for choosing which document to use if multiple ones match the query. Only giving two parameters will result in the "need remove or update" error message.

collection('MyCollection').findAndModify(
    { _id: "auto" },
    [],
    { $inc: { "bill": 1 } },
    { upsert: true, new: true },
    function(err,doc) {
       // work here
    }
);
like image 37
Paul Van Camp Avatar answered Sep 22 '22 14:09

Paul Van Camp


Hi I have followed this and it worked perfectly.

db.collection('test').findAndModify(
  {hello: 'world'}, // query
  [['_id','asc']],  // sort order
  {$set: {hi: 'there'}}, // replacement, replaces only the field "hi"
  {}, // options
  function(err, object) {
      if (err){
          console.warn(err.message);  // returns error if no matching object found
      }else{
          console.dir(object);
      }
  });
});
like image 21
vijesh mundayat Avatar answered Sep 21 '22 14:09

vijesh mundayat