Home:ALL Converter>Return MongoDB documents that don't contain specific inner array items

Return MongoDB documents that don't contain specific inner array items

Ask Time:2016-10-09T01:40:37         Author:Barak Yaari

Json Formatter

How can I return a set of documents, each not containing a specific item in an inner array?

My data scheme is:

Posts:

{ 
    "_id" : ObjectId("57f91ec96241783dac1e16fe"), 
    "votedBy" : [
        {
            "userId" : "101",
            "vote": 1
        }, 
        {
            "userId" : "202",
            "vote": 2
        }
    ], 
    "__v" : NumberInt(0)
}

I want to return a set of posts, non of which contain a given userId in any of the votedBy array items. The official documentation implies that this is possible:

MongoDB documentation: Field with no specific array index

Though it returns an empty set (for the more simple case of finding a document with a specific array item). It seems like I have to know the index for a correct set of results, like: votedBy.0.userId.

This Question is the closest I found, with this solution (Applied on my scheme):

db.collection.find({"votedBy": { $not: {$elemMatch: {userId: 101 } } } })

It works fine if the only inner document in the array matches the one I wish not to return, but in the example case I specified above, the document returns, because it finds the userId=202 inner document.

Just to clarify: I want to return all the documents, that NONE of their votedBy array items have the given userId.

I also tried a simpler array, containing only the userId's as an array of Strings, but still, each of them receives an Id and the search process is just the same.

Another solution I tried is using a different collection for uservotes, and applying a lookup to perform a SQL-similar join, but it seems like there is an easier way.

I am using mongoose (node.js).

Author:Barak Yaari,eproduced under the CC 4.0 BY-SA copyright license with a link to the original source and this disclaimer.
Link to original article:https://stackoverflow.com/questions/39935405/return-mongodb-documents-that-dont-contain-specific-inner-array-items
yy