In mongodb I have collection where arrays has duplicate entries like
{
\"_id\": ObjectId(\"57cf3cdd5f20a3b0ba009777\"),
\"Chat\": 6,
\"string\":
db.getCollection('Test').aggregate([{
$unwind: '$string'},
{
$group: {
_id: '$_id',
string: {
$addToSet: '$string'
},
Chat: {
$first: '$Chat'
}
}
}
]);
O/P: here you are getting 2 "1348157031 Riyadh" because there is an extra space which defines itself as an different entity.
{
"_id" : ObjectId("57cf3cdd5f20a3b0ba009777"),
"string" : [
" 1348157031 Riyadh",
" 548275320 Mohammad Sumon",
"1348157031 Riyadh"
],
"Chat" : 6
}
Mongo 3.4+ has $addFields aggregation stage, which allows you to avoid explicitly listing all the other fields to keep:
collection.aggregate([
{"$addFields": {
"string": {"$setUnion": ["$string", []]}
}}
])
Just for reference, here is another (more lengthy) way that uses $replaceRoot and also doesn't require listing all possible fields:
collection.aggregate([
{'$unwind': {
'path': '$string',
// output the document even if its list of books is empty
'preserveNullAndEmptyArrays': true
}},
{'$group': {
'_id': '$_id',
'string': {'$addToSet': '$string'},
// arbitrary name that doesn't exist on any document
'_other_fields': {'$first': '$$ROOT'},
}},
{
// the field, in the resulting document, has the value from the last document merged for the field. (c) docs
// so the new deduped array value will be used
'$replaceRoot': {'newRoot': {'$mergeObjects': ['$_other_fields', "$$ROOT"]}}
},
{'$project': {'_other_fields': 0}}
])