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

Opdater indlejret objekt i MongoDB, hvis det findes, ellers tilføj det

For at indsætte et dokument, hvis det ikke eksisterer, gøres ved upsert, og hvis du vil opdatere et betinget indlejret dokument, skal du bruge $ positional operator. Så du skal bruge begge i forespørgslen for at implementere ovenstående funktionalitet.

Men lige nu understøtter mongodb ikke upserting med $ positional operator

Så det, du ønsker, er ikke muligt at gøre det i én forespørgsel i øjeblikket, alternativt kan du gøre det i to forespørgsler.

Først

db.collection('ratings').update(
  {"refid":refid, "votes.ip": ip},
  {
     $set: { "votes.$.rating":rating }
  }
)

Det returnerer antallet af opdaterede dokumenter, hvis det er 1 er det fint, og hvis det er 0, skal du skubbe ny rekord.

db.collection('ratings').update( { "refid":refid, "votes.ip":{$ne: ip}},
    {$push: { votes: { "ip":ip , "rating":rating  }}
})

Der er også jira-billet til positional operator og upserting, plz stem på dette problem, hvis du vil have denne funktionalitet i mongodb. Nedenfor er linket til problemet

https://jira.mongodb.org/browse/SERVER-3326

(EDIT :Jira-billetten blev lukket med Won't Do i juni 2019)



  1. Hvordan udfylder man dybt indlejrede id'er efter samlet opslag i mongodb?

  2. mongodb db.collection.find({}) gør intet efter .limit(101)

  3. MongoDB-godkendelse er ikke aktiveret på Linux Server

  4. Sådan sletter du mange dokumenter i en partitioneret samling i Azure CosmosDB ved hjælp af MongoDB API