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

Hvordan føjer jeg Mongo DB-aggregeringsresultater til en eksisterende samling?

Starter Mongo 4.2 , den nye $merge aggregeringsoperator (svarende til $out ) tillader sammenfletning resultatet af en aggregeringspipeline til den angivne samling:

Givet dette input:

db.source.insert([
  { "_id": "id_1", "a": 34 },
  { "_id": "id_3", "a": 38 },
  { "_id": "id_4", "a": 54 }
])
db.target.insert([
  { "_id": "id_1", "a": 12 },
  { "_id": "id_2", "a": 54 }
])

$merge aggregeringstrin kan bruges som sådan:

db.source.aggregate([
  // { $whatever aggregation stage, for this example, we just keep records as is }
  { $merge: { into: "target" } }
])

at producere:

// > db.target.find()
{ "_id" : "id_1", "a" : 34 }
{ "_id" : "id_2", "a" : 54 }
{ "_id" : "id_3", "a" : 38 }
{ "_id" : "id_4", "a" : 54 }

Bemærk, at $merge operatør kommer med mange muligheder for at angive, hvordan indsatte poster, der er i konflikt med eksisterende poster, flettes.

I dette tilfælde (med standardindstillingerne), dette:

  • beholder målsamlingens eksisterende dokumenter (dette er tilfældet med { "_id": "id_2", "a": 54 } )

  • indsætter dokumenter fra outputtet af aggregeringspipelinen i målsamlingen, når de ikke allerede er til stede (baseret på _id - dette er tilfældet for { "_id" : "id_3", "a" : 38 } )

  • erstatter målsamlingens poster, når aggregeringspipelinen producerer dokumenter, der findes i målsamlingen (baseret på _id - dette er tilfældet for { "_id": "id_1", "a": 12 } erstattet af { "_id" : "id_1", "a" : 34 } )



  1. Hvordan flytter jeg en tailable cursor med awaitdata til slutningen, så jeg bare får nye opdateringer

  2. MongoDB/Mongoose - Forespørgsel efter en række objekter efter dato

  3. Brug af StackExchange.Redis-klient med Redis-klynge

  4. Kan ikke godkendes til mongo, godkendelse mislykkes