Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
183
rated 0 times [  187] [ 4]  / answers: 1 / hits: 31016  / 10 Years ago, tue, october 21, 2014, 12:00:00

I have the following model:



var PersonSchema = new Schema({
name: String,
groups: [
{type: Schema.Types.ObjectId, ref: 'Group'}
],
});


I am looking for a query that retrieves all the Persons that are not part of a certain Group (i.e the persons' group array doesn't contain the id of the specified group).



I was thinking about something like this, but I'm not sure it is correct:



Person.find({groups: {$nin: [group._id]})


More From » node.js

 Answers
5


Nothing wrong with what you are basically attempting, but perhaps the only clarification here is the common misconception that you need operators like $nin or $in when querying an array.



Also you really need to do here is a basic inequality match with $ne:



Person.find({ groups: { $ne: group._id } })


The array operators are not for array targets but for providing a list of conditions to test in a convenient form.



Person.find({ groups: { $nin: [oneId, twoId,threeId] } })


So just use normal operators for single conditions, and save $in and $nin for where you want to test more than one condition against either a single value or a list. So it's just the other way around.



If you do need to pass a list of arguments where none of those in the provided list match the contents of the array then you reverse the logic with the $not operator and the $all operator:



Person.find({ groups: { $not: { $all: [oneId,twoId,threeId] } } })


So that means that none of the list provided are present in the array.


[#69060] Saturday, October 18, 2014, 10 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
ignacio

Total Points: 467
Total Questions: 128
Total Answers: 79

Location: Luxembourg
Member since Tue, Mar 14, 2023
1 Year ago
ignacio questions
;