3 votes

suppression des valeurs de tableau dupliquées dans mongodb

Dans mongodb j'ai une collection où les tableaux ont des entrées en double comme

{
    "_id": ObjectId("57cf3cdd5f20a3b0ba009777"),
    "Chat": 6,
    "string": [
        "1348157031 Riyadh",
        " 548275320 Mohammad Sumon",
        " 1348157031 Riyadh",
        " 548275320 Mohammad Sumon",
        " 1348157031 Riyadh",
        " 1348157031 Riyadh"
    ]
}

J'ai besoin de supprimer les tableaux dupliqués et de ne garder que les valeurs uniques des tableaux comme ci-dessous.

{
    "_id": ObjectId("57cf3cdd5f20a3b0ba009777"),
    "Chat": 6,
    "string": [
        "1348157031 Riyadh",
        " 548275320 Mohammad Sumon",
    ]
}

quelle serait la meilleure façon de procéder

merci

2voto

Shantanu Madane Points 391

Db.getCollection('Test').aggregate([{$unwind : '$string'}, {$group : {_id : '$_id',string : {$addToSet : '$string'}, Chat : {$first : '$Chat'}}]) ;)

O/P : ici vous obtenez 2 "1348157031 Riyadh" parce qu'il y a un espace supplémentaire qui se définit comme une entité différente.

{
    "_id" : ObjectId("57cf3cdd5f20a3b0ba009777"),
    "string" : [ 
        " 1348157031 Riyadh", 
        " 548275320 Mohammad Sumon", 
        "1348157031 Riyadh"
    ],
    "Chat" : 6
}

0voto

Denis Golomazov Points 1211

Mongo 3.4+ possède $addFields étape d'agrégation, ce qui permet d'éviter de lister explicitement tous les autres champs à conserver :

collection.aggregate([
    {"$addFields": {
        "string": {"$setUnion": ["$string", []]}
    }}
])

À titre de référence, voici une autre méthode (plus longue) qui utilise $replaceRoot et ne nécessite pas non plus d'énumérer tous les champs possibles :

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}}
])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X