MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comparer des tableaux et renvoyer la différence

Les seules choses qui "modifient" le document en réponse sont .aggregate() et .mapReduce() , où le premier est la meilleure option.

Dans ce cas, vous demandez $setDifference qui compare les "ensembles" et renvoie la "différence" entre les deux.

Donc représenter un document avec votre tableau :

db.collection.insert({ "b": [1, 3, 5, 6, 7, 10] })

Exécutez l'agrégation :

db.collection.aggregate([{ "$project": { "c": { "$setDifference": [ [2,3,4], "$b" ] } } }])

Qui renvoie :

{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4 ] }

Si vous ne voulez pas d'"ensembles" et souhaitez plutôt fournir un tableau comme [2,3,4,4] alors vous pouvez comparer avec $filter et $in à la place, si vous avez au moins MongoDB 3.4 :

db.collection.aggregate([
  { "$project": {
    "c": {
      "$filter": {
        "input": [2,3,4,4],
        "as": "a",
        "cond": {
          "$not": { "$in": [ "$$a", "$b" ]  }
        }
      }
    }   
  }}
])

Ou avec $filter et $anyElementTrue dans les versions antérieures :

db.collection.aggregate([
  { "$project": {
    "c": {
      "$filter": {
        "input": [2,3,4,4],
        "as": "a",
        "cond": {
          "$not": {
            "$anyElementTrue": {
              "$map": {
                "input": "$b",
                "as": "b",
                "in": {
                  "$eq": [ "$$a", "$$b" ]    
                }
              }    
            }
          }
        }    
      }
    }    
  }}
])

Où les deux reviendraient :

{ "_id" : ObjectId("596005eace45be96e2cb221b"), "c" : [ 2, 4, 4 ] }

Ce qui n'est bien sûr "pas un ensemble" puisque le 4 a été fourni comme entrée "deux fois" et est donc renvoyé "deux fois" également.