sql >> Database >  >> NoSQL >> MongoDB

Vergelijk arrays en retourneer het verschil

De enige dingen die het document als reactie "aanpassen" zijn .aggregate() en .mapReduce() , waarbij de eerste de betere optie is.

In dat geval vraagt ​​u om $setDifference die de "sets" vergelijkt en het "verschil" tussen de twee retourneert.

Dus een document vertegenwoordigen met je array:

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

Voer de aggregatie uit:

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

Wat terugkomt:

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

Als u geen "sets" wilt en in plaats daarvan een array wilt leveren zoals [2,3,4,4] dan kun je vergelijken met $filter en $in in plaats daarvan, als je tenminste MongoDB 3.4 hebt:

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

Of met $filter en $anyElementTrue in eerdere versies:

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

Waar beide zouden terugkeren:

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

Wat natuurlijk "geen set" is sinds de 4 is opgegeven als invoer "tweemaal" en wordt daarom ook "tweemaal" geretourneerd.




  1. De 10 beste MongoDB-hostingplatforms

  2. ServiceStack.Redis:kan geen verbinding maken:sPort:50071

  3. MongoDB verbinden vanuit een mobiele of browsergebaseerde applicatie

  4. Verander het type veld binnen mongoDB-aggregatie en gebruikt $lookup index op velden of niet?