alexmngn alexmngn - 1 month ago 22
Javascript Question

Aggregate match pipeline not equal to in MongoDB

I am working on an aggregate pipeline for MongoDB, and I am trying to retrieve items where the user is not equal to a variable.

For some reason, I couldn't make it work. I tried to use

$not
,
$ne
and
$nin
in different possible way but can't make it to work.

This is how it looks like:

Data sample:

[{
"_id": { "$oid": "565674e2e4b030fba33d8fdc" },
"user": { "$oid": "565674832b85ce78732b7529" }
}, {
"_id": { "$oid": "565674e2e4b030fba33d8fdc" },
"user": { "$oid": "565674832b85ce78732b7529" }
}, {
"_id": { "$oid": "565674e2e4b030fba33d8fdc" },
"user": { "$oid": "56f9dfc5cc03ec883f7675d0" }
}]


Pipeline sample (simplified for this question):

Where
req.query.user.id = "565674832b85ce78732b7529"


collection.aggregate([
{
$match: {
user: {
$nin: [ req.query.user.id ],
}
}
}
]


This should return only the last item.

Do you have any idea how to retrieve the data that doesn't match the user?

Thanks

Edit:
The following doesn't work either:

collection.aggregate([
{
$match: {
'user.$oid': {
$nin: [ req.query.user.id ],
}
}
}
]);


I also tried with
ObjectID()
and mongodb complains:
[MongoError: Argument must be a string]


var ObjectID = require('mongodb').ObjectID;

// Waterline syntax here
MyCollection.native(function (err, collection) {
collection.aggregate([
{
$match: {
'user': {
$nin: [ ObjectID(req.query.user.id) ],
}
}
}
], function (err, result) {
console.log(err, result);
});
});


But this line works in the shell:

db.collection.aggregate([{$match:{"user":{"$nin":[ObjectId("565674832b85ce78732b7529")]}}}])

Answer

Based on the answer here, you can change

var ObjectId = require('mongodb'). ObjectID;

to

var ObjectId = require('sails-mongo/node_modules/mongodb').ObjectID;