Home > Net >  Return Documents with Same Subarray elements
Return Documents with Same Subarray elements

Time:06-02

I have the following collection:

{ "_id" : 1, "tags" : [ "school", "home" ] }
{ "_id" : 2, "tags" : [ "school", "storage", "home" ] }
{ "_id" : 3, "tags" : [ "school", "storage", "home", "bones" ] }
{ "_id" : 4, "tags" : [ "school", "storage", "home", "bones", "milk" ] }
{ "_id" : 5, "tags" : [ "homes", "maps", "bones" ] }
{ "_id" : 6, "tags" : [ "xxx", "yyy", "zzz" ] }

I would like to return all documents where "tags" matches documents with exactly the same array elements.

So thus, if I were to query for tags == ["school", "home"] or tags == ["home", "school"], document w/ _id=1 would be returned

I am doing the following:

db.test.find({tags: {$in: ['school', 'home']}}) or 
db.test.find({tags: {$in: ['home', 'school']}})

and the following are returned:

{ "_id" : 1, "tags" : [ "school", "home" ] }
{ "_id" : 2, "tags" : [ "school", "storage", "home" ] }
{ "_id" : 3, "tags" : [ "school", "storage", "home", "bones" ] }
{ "_id" : 4, "tags" : [ "school", "storage", "home", "bones", "milk" ] }

How may I achieve only item w/ _id=1 be returned?

CodePudding user response:

Maybe something like this:

Option 1:

 db.collection.find({
  $and: [
 {
  tags: "school"
 },
 {
  tags: "home"
 },
 {
  tags: {
      $size: 2
    }
 }
 ]
})

Explained:

Match if school & home are in the tags array and if array size is 2.

Playground

Option 2:

db.collection.find({
 $or: [
  {
    tags: [
    "school",
    "home"
  ]
  },
  {
  tags: [
    "home",
    "school"
  ]
  }
 ]
})

Explained:

Match the two possible array options

Playground2

  • Related