Gunjan Patel
Gunjan Patel

Reputation: 2372

Mongoose find not match ids from array which passed

I'm stuck in mongoose query. I've an array of ids as input, I want to search that array of ids in a database for matching elements. It returns perfect result after using $in in find query.

Now, I want that Ids from an array which is not found in the database. what is the best way to do it?

Please try to comment it.

   Template.find({
           _ids : [
             "as6d87as67da7s8d87a87",  // available in database
             "as6dasd8sa9d8a9a9s8d7",  // not-available in database
             "6756asd5as6dsadghasd3",  // available in database
          ]
   }, function(err, result){
         // Need result as "as6dasd8sa9d8a9a9s8d7", which is not matched. or in object.
         // Can we do with `aggregate` query?
   });

Upvotes: 2

Views: 1030

Answers (2)

Ram Prasad
Ram Prasad

Reputation: 1

Answer by David will work. The idea here is to compare _ids array with the _ids in the result and return the missing ones. Adding more code just for understanding purposes:

  1. Push _id of result into a new array
  2. Compare _ids and the new array to return missing elements

    var resIDs = new Array();
    for (var i = 0; i < result.length; i++) {
        resIDs.push(result[i]._id.toString());
    }
    var resultFiltered = 
        _ids.filter(function (v) {
            return !resIDs.includes(v.toString());
    })
    

Upvotes: 0

David Vicente
David Vicente

Reputation: 3111

I think this makes what you want

   var _ids =  [
             "as6d87as67da7s8d87a87",
             "as6dasd8sa9d8a9a9s8d7",
             "6756asd5as6dsadghasd3"
          ];
   Template.find({
           _ids : _ids
   }, function(err, result){
         var filteredResult = _ids.filter(currentId => !result.some(item => item._id.toString() == currentId));
   });

Upvotes: 1

Related Questions