sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongodb:tryck element till kapslad array om villkoret är uppfyllt

Problemet här är att du missförstår en rad saker.

När du gör "outerArray.field.innerArray": { $in: [ 1, 3 ] } i din fråga får du inte bara innerArray där har 1 eller 3. Du får dokument där dessa arrayer finns.

Så du frågar efter hela dokumentet.

Du måste använda arrayFilter för att uppdatera värden när filtret matchar.

Så om jag har förstått dig rätt är frågan du vill ha:

db.collection.update(
{}, //Empty object to find all documents
{
  $push: { "outerArray.$[elem].field.innerArray": 4 }
},
{
  "arrayFilters": [ { "elem.field.innerArray": { $in: [ 1, 3 ] } } ]
})

Exempel här

Notera hur det första objektet i update är tom. Du måste placera fältet där för att matcha dokumentet (inte arrayen, dokumentet).

Om du bara vill uppdatera ett dokument måste du fylla det första objektet (frågeobjekt) med värden du vill ha, till exempel:{"_id": 11} .




  1. Arbetar du med kapslade objekt i Redis?

  2. Skicka en MongoDB-fråga till ett annat system:konvertera till JSON och sedan avkoda till BSON? Hur gör man det på Go-språket?

  3. mongoose/mongodb fråga flera sorter

  4. MongoDB $gt Aggregation Pipeline Operator