2

I have the following document:

{
  userId: 1234,
  contacts: ['a', 'b', 'c', 'd'],
  conversations: ['a', 'b', 'e'],
}

I want to get distinct value from the contacts and conversations array. So for this case, the output should be: a, b, c, d, e

fardeem
  • 594
  • 5
  • 13

1 Answers1

2

Use $setUnion operator to aggregate values from two arrays:

db.test.aggregate([
    {
        $project: {
            userId: 1, 
            values: {
                $setUnion: [
                    '$contacts',
                    '$conversations'
                ]
            }
        }
    }
])

Result:

{ "userId" : 1234, "values" : [ "a", "b", "c", "d", "e" ] }

UPDATE: For MongoDB 2.4 you can map each document on client side. Define unique function for array. And then simply map each document

db.test.find().map(function(doc) {
   return { 
      userId : doc.userId, 
      values : doc.contacts.concat(doc.conversations).unique()
   };
})

Note: if there is several documents with same userId you can group them on server side.

turivishal
  • 34,368
  • 7
  • 36
  • 59
Sergey Berezovskiy
  • 232,247
  • 41
  • 429
  • 459