9

I have a field _keywords which is an array of strings. I want to get documents where _keywords is a super-set of the query array.

For example:

db.article.insert({'_keywords': ['foo', 'foo1', 'foo2']})

I want to retrieve this record when I query subset of ['foo', 'foo1', 'foo2'], eg: ['foo'] or ['foo1', 'foo2']

EDIT: something like:

db.article.find({'_keywords': {$contains: array}})
tagurit
  • 494
  • 5
  • 13
Jensen
  • 1,653
  • 4
  • 26
  • 42

3 Answers3

17

In MongoDb, for array field:

"$in:[...]" means "intersection" or "any element in",
"$all:[...]" means "subset" or "contain",
"$elemMatch:{...}" means "any element match"
"$not:{$elemMatch:{$nin:[...]}}" means "superset" or "in"
diyism
  • 12,477
  • 5
  • 46
  • 46
  • Great breakdown into set theory! Helped me get my head around it since I needed the field to be a subset meaning the values passed in the query are the superset (the double negation query at the end). – Miguel Pereira Sep 14 '18 at 09:10
13

Use the $all operator:

db.article.find( { _keywords: { $all: [ 'foo1', 'foo2' ] } } );

Source: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24all

Dmitry
  • 4,232
  • 2
  • 15
  • 13
  • How to retrive documents where `_keywords` contains any item in the given query array. something like: `db.article.find({_keywords: {$any: ['foo1', 'foo2']}})`, which returns any documents with _keywords contains 'foo1' or 'foo2' – Jensen Aug 31 '12 at 23:55
  • 1
    As I can remember, in such case you can use `$in`, for example: `db.article.find({_keywords: {$in: ['foo1', 'foo2']}})`. Check if this is right. – Dmitry Sep 01 '12 at 00:02
2

Short answer: $all operator.
To query documents with array with superset of ['foo1', 'foo2'], use:
db.article.find( { '_keywords': { $all: ['foo1', 'foo2'] } } );

mrówa
  • 5,671
  • 3
  • 27
  • 39