sql >> Database teknologi >  >> NoSQL >> MongoDB

Sammenlign arrays og returner forskellen

De eneste ting, der "modificerer" dokumentet som svar, er .aggregate() og .mapReduce() , hvor førstnævnte er den bedre mulighed.

I så fald beder du om $setDifference som sammenligner "sættene" og returnerer "forskellen" mellem de to.

Så repræsenterer et dokument med dit array:

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

Kør aggregeringen:

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

Hvilket returnerer:

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

Hvis du ikke ønsker "sæt" og i stedet vil levere et array som [2,3,4,4] så kan du sammenligne med $filter og $in i stedet, hvis du i det mindste har MongoDB 3.4:

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

Eller med $filter og $anyElementTrue i tidligere versioner:

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

Hvor begge ville vende tilbage:

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

Hvilket selvfølgelig er "ikke et sæt" siden 4 blev angivet som input "to gange" og returneres derfor også "to gange".




  1. Redis:Mislykket åbning af .rdb til lagring:Tilladelse nægtet

  2. Meteor og DBRefs

  3. Cloudera operationel databasereplikering i en nøddeskal

  4. Sådan organiserer du et mange til mange forhold i MongoDB