MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Vergleichen Sie Arrays und geben Sie die Differenz zurück

Die einzigen Dinge, die das Dokument als Antwort "modifizieren", sind .aggregate() und .mapReduce() , wobei Ersteres die bessere Option ist.

In diesem Fall fragen Sie nach $setDifference die die "Sätze" vergleicht und die "Differenz" zwischen den beiden zurückgibt.

So stellen Sie ein Dokument mit Ihrem Array dar:

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

Führen Sie die Aggregation aus:

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

Was zurückgibt:

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

Wenn Sie keine "Sets" möchten und stattdessen ein Array wie [2,3,4,4] bereitstellen möchten dann kannst du mit $filter vergleichen und $in stattdessen, wenn Sie mindestens MongoDB 3.4 haben:

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

Oder mit $filter und $anyElementTrue in früheren Versionen:

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

Wohin beide zurückkehren würden:

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

Was natürlich seit der 4 "kein Satz" ist wurde als Input "zweimal" bereitgestellt und wird daher auch "zweimal" zurückgegeben.