sql >> Base de Datos >  >> NoSQL >> MongoDB

Compara matrices y devuelve la diferencia

Las únicas cosas que "modifican" el documento en respuesta son .aggregate() y .mapReduce() , donde la primera es la mejor opción.

En ese caso, está solicitando $setDifference que compara los "conjuntos" y devuelve la "diferencia" entre los dos.

Entonces, representando un documento con su matriz:

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

Ejecute la agregación:

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

Que devuelve:

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

Si no desea "conjuntos" y, en cambio, desea proporcionar una matriz como [2,3,4,4] entonces puedes comparar con $filter y $in en cambio, si tiene MongoDB 3.4 al menos:

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

O con $filter y $anyElementTrue en versiones anteriores:

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

Donde ambos regresarían:

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

Lo cual, por supuesto, "no es un conjunto" ya que el 4 se proporcionó como entrada "dos veces" y, por lo tanto, también se devuelve "dos veces".