Come aggiornare più elementi dell'array in mongodb


183

Ho un documento Mongo che contiene una serie di elementi.

Vorrei ripristinare l' .handledattributo di tutti gli oggetti dell'array dove .profile= XX.

Il documento è nella seguente forma:

{
    "_id": ObjectId("4d2d8deff4e6c1d71fc29a07"),
    "user_id": "714638ba-2e08-2168-2b99-00002f3d43c0",
    "events": [{
            "handled": 1,
            "profile": 10,
            "data": "....."
        } {
            "handled": 1,
            "profile": 10,
            "data": "....."
        } {
            "handled": 1,
            "profile": 20,
            "data": "....."
        }
        ...
    ]
}

così, ho provato quanto segue:

.update({"events.profile":10},{$set:{"events.$.handled":0}},false,true)

Tuttavia aggiorna solo il primo elemento dell'array corrispondente in ciascun documento. (Questo è il comportamento definito per $ - l'operatore posizionale .)

Come posso aggiornare tutti gli elementi dell'array corrispondenti?


2
L'aggiornamento di un sottoinsieme o di tutti gli elementi dell'array è stato aggiunto a mongodb 3.6: docs.mongodb.com/manual/reference/operator/update/…
Jaap

assicurati di controllare arrayFilters e considera quale query utilizzare per rendere efficiente l'aggiornamento. Controlla la risposta di Neil Lunn: stackoverflow.com/a/46054172/337401
Jaap

controlla la mia risposta
Ucdemir,

Risposte:


111

Al momento non è possibile utilizzare l'operatore di posizione per aggiornare tutti gli elementi in un array. Vedi JIRA http://jira.mongodb.org/browse/SERVER-1243

Per aggirare il problema puoi:

  • Aggiorna ogni articolo singolarmente (events.0.handled events.1.handled ...) o ...
  • Leggi il documento, esegui le modifiche manualmente e salvalo sostituendo quello precedente (seleziona "Aggiorna se corrente" se vuoi assicurarti aggiornamenti atomici)

15
se hai problemi simili, vota per questo problema - jira.mongodb.org/browse/SERVER-1243
LiorH,

In realtà mi piace il documento letto e l'approccio al salvataggio. Ma ho usato Couch prima di Mongo, quindi l'approccio sembra più naturale poiché non esiste un'API di query per Couch, ma solo un'API REST per interi documenti
adam

1
Entrambi questi approcci richiedono una quantità di memoria piuttosto elevata, giusto? Se ci sono molti documenti che devono essere cercati e devono caricarli tutti (o gli array nidificati) per aggiornare ... + anche un po 'problematico da implementare se questo deve essere fatto in modo asincrono ...
Ixx,

13
A parte tutte le difficoltà tecniche, è piuttosto sorprendente che questa funzione non sia disponibile in MongoDB. Questo vincolo toglie molta libertà alla personalizzazione dello schema del database.
Sung Cho,

5
Neil Lunn stackoverflow.com/a/46054172/337401 ha risposto a questa versione 3.6. Poiché questa è una domanda popolare, potrebbe valere la pena aggiornare questa risposta accettata con un riferimento alla risposta di Neil Lunn.
Jaap,

73

Con il rilascio di MongoDB 3.6 (e disponibile nel ramo di sviluppo da MongoDB 3.5.12) è ora possibile aggiornare più elementi dell'array in una singola richiesta.

Questo utilizza la sintassi dell'operatore di aggiornamento posizionale filtrato$[<identifier>] introdotta in questa versione:

db.collection.update(
  { "events.profile":10 },
  { "$set": { "events.$[elem].handled": 0 } },
  { "arrayFilters": [{ "elem.profile": 10 }], "multi": true }
)

Il "arrayFilters"come passato per le opzioni per .update()o addirittura .updateOne(), .updateMany(), .findOneAndUpdate()o .bulkWrite()specifica di metodo le condizioni per corrispondono sulla identificativo indicato nella dichiarazione di aggiornamento. Tutti gli elementi che soddisfano la condizione fornita verranno aggiornati.

Notando che il "multi"dato fornito nel contesto della domanda è stato usato nell'aspettativa che questo "aggiornasse più elementi", ma non è stato e non è ancora così. Il suo utilizzo qui si applica a "più documenti" come è sempre stato il caso o ora altrimenti specificato come impostazione obbligatoria .updateMany()nelle moderne versioni dell'API.

NOTA Un po 'ironicamente, poiché questo è specificato nell'argomento "opzioni" per .update()metodi simili e simili, la sintassi è generalmente compatibile con tutte le versioni recenti dei driver di rilascio.

Tuttavia questo non è vero per la mongoshell, poiché il modo in cui il metodo è implementato lì ("ironicamente per la compatibilità con le versioni precedenti") l' arrayFiltersargomento non viene riconosciuto e rimosso da un metodo interno che analizza le opzioni al fine di fornire "compatibilità con le versioni precedenti" con Versioni del server MongoDB e una .update()sintassi di chiamata API "legacy" .

Quindi, se si desidera utilizzare il comando nella mongoshell o altri prodotti "basati sulla shell" (in particolare Robo 3T), è necessaria una versione più recente del ramo di sviluppo o della versione di produzione dalla 3.6 o successiva.

Vedere anche positional all $[]che aggiorna anche "più elementi dell'array" ma senza applicare le condizioni specificate e si applica a tutti gli elementi dell'array in cui è l'azione desiderata.

Vedere anche Aggiornamento di una matrice nidificata con MongoDB per come questi nuovi operatori posizionali si applicano alle strutture di matrice "nidificate", dove "le matrici si trovano all'interno di altre matrici".

IMPORTANTE - Le installazioni aggiornate dalle versioni precedenti "potrebbero" non avere abilitato le funzionalità MongoDB, il che può anche causare il fallimento delle istruzioni. È necessario assicurarsi che la procedura di aggiornamento sia completa con dettagli come gli aggiornamenti dell'indice e quindi eseguire

   db.adminCommand( { setFeatureCompatibilityVersion: "3.6" } )

O versione successiva come applicabile alla versione installata. vale "4.0"a dire per la versione 4 e successive. Ciò ha consentito funzioni come i nuovi operatori di aggiornamento posizionale e altri. Puoi anche verificare con:

   db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )

Per ripristinare l'impostazione corrente


9
La risposta accettata deve essere aggiornata e fare riferimento a questa risposta.
Jaap,

2
Che cosa è elem?
user1063287

1
Questo è corretto. Nota che RoboMongo non supporta arrayFiltersancora, quindi esegui l' aggiornamento tramite CLI. stackoverflow.com/questions/48322834/...
drlff

grazie, Neil, soprattutto per la sezione IMPORTANTE, esattamente ciò di cui avevo bisogno
janfabian,

questo codice restituisce ERRORE in pymongo. tehre is error: raise TypeError ("% s deve essere True o False"% (opzione,)) TypeError: upsert deve essere True o False
Vagif

67

Ciò che ha funzionato per me è stato questo:

db.collection.find({ _id: ObjectId('4d2d8deff4e6c1d71fc29a07') })
  .forEach(function (doc) {
    doc.events.forEach(function (event) {
      if (event.profile === 10) {
        event.handled=0;
      }
    });
    db.collection.save(doc);
  });

Penso che sia più chiaro per i neofiti di mongo e per chiunque abbia familiarità con JQuery e gli amici.


Sto usando db.posts.find({ 'permalink':permalink }).forEach( function(doc) {...e sto ottenendoOops.. TypeError: Object # has no method 'forEach'
Squirrl il

3
@Squirrl potrebbe essere obsoleto versione mongodb? Il documento è chiaro su come applicare ogni funzione su un cursore, ma non indica da quale versione è supportata. docs.mongodb.org/manual/reference/method/cursor.forOach
Daniel Cerecedo

@Squirrl provaredb.posts.find(...).toArray().forEach(...)
marmor

Non possiamo farlo senza usare Javascript? Voglio eseguire questo aggiornamento direttamente da una shell mongo senza utilizzare l'API Javascript.
Meliodas,

1
Puoi per favore scrivere questa query nel driver mongodb per java o con spring-data-mongodb? Grazie, Kris
Chiku,

18

Questo può essere realizzato anche con un ciclo while che controlla se rimangono dei documenti che hanno ancora documenti secondari che non sono stati aggiornati. Questo metodo preserva l'atomicità dei tuoi aggiornamenti (cosa che molte delle altre soluzioni qui non lo fanno).

var query = {
    events: {
        $elemMatch: {
            profile: 10,
            handled: { $ne: 0 }
        }
    }
};

while (db.yourCollection.find(query).count() > 0) {
    db.yourCollection.update(
        query,
        { $set: { "events.$.handled": 0 } },
        { multi: true }
    );
}

Il numero di volte in cui viene eseguito il ciclo sarà uguale al numero massimo di volte in cui i documenti secondari sono profileuguali a 10 e handlednon uguali a 0 in nessuno dei documenti della raccolta. Quindi se hai 100 documenti nella tua raccolta e uno di essi ha tre documenti secondari corrispondenti querye tutti gli altri documenti hanno meno documenti secondari corrispondenti, il ciclo verrà eseguito tre volte.

Questo metodo evita il pericolo di ostruire altri dati che potrebbero essere aggiornati da un altro processo mentre questo script viene eseguito. Riduce inoltre al minimo la quantità di dati trasferiti tra client e server.


13

Questo in effetti si riferisce al problema di vecchia data su http://jira.mongodb.org/browse/SERVER-1243 dove ci sono in realtà una serie di sfide a una chiara sintassi che supporta "tutti i casi" in cui le corrispondenze di array multipli sono trovato. Esistono infatti già metodi che "aiutano" a risolvere questo problema, come le operazioni in blocco che sono state implementate dopo questo post originale.

Non è ancora possibile aggiornare più di un singolo elemento array corrispondente in una singola istruzione di aggiornamento, quindi anche con un aggiornamento "multi" tutto ciò che sarai in grado di aggiornare è solo un elemento matematico nell'array per ciascun documento in quel singolo dichiarazione.

La migliore soluzione possibile al momento è quella di trovare ed eseguire il ciclo di tutti i documenti corrispondenti ed elaborare gli aggiornamenti in blocco che consentiranno almeno di inviare molte operazioni in una singola richiesta con una risposta singolare. È possibile utilizzare facoltativamente .aggregate()per ridurre il contenuto dell'array restituito nei risultati della ricerca a quelli che corrispondono alle condizioni per la selezione dell'aggiornamento:

db.collection.aggregate([
    { "$match": { "events.handled": 1 } },
    { "$project": {
        "events": {
            "$setDifference": [
               { "$map": {
                   "input": "$events",
                   "as": "event",
                   "in": {
                       "$cond": [
                           { "$eq": [ "$$event.handled", 1 ] },
                           "$$el",
                           false
                       ]
                   }
               }},
               [false]
            ]
        }
    }}
]).forEach(function(doc) {
    doc.events.forEach(function(event) {
        bulk.find({ "_id": doc._id, "events.handled": 1  }).updateOne({
            "$set": { "events.$.handled": 0 }
        });
        count++;

        if ( count % 1000 == 0 ) {
            bulk.execute();
            bulk = db.collection.initializeOrderedBulkOp();
        }
    });
});

if ( count % 1000 != 0 )
    bulk.execute();

La .aggregate()parte lì funzionerà quando esiste un identificatore "univoco" per l'array o tutto il contenuto per ciascun elemento forma un elemento "unico" stesso. Ciò è dovuto all'operatore "set" $setDifferenceutilizzato per filtrare tutti i falsevalori restituiti $mapdall'operazione utilizzata per elaborare l'array per le corrispondenze.

Se il contenuto dell'array non ha elementi univoci, puoi provare un approccio alternativo con $redact:

db.collection.aggregate([
    { "$match": { "events.handled": 1 } },
    { "$redact": {
        "$cond": {
            "if": {
                "$eq": [ { "$ifNull": [ "$handled", 1 ] }, 1 ]
            },
            "then": "$$DESCEND",
            "else": "$$PRUNE"
        }
    }}
])

Il limite è che se "gestito" fosse in realtà un campo destinato ad essere presente ad altri livelli del documento, probabilmente si otterranno risultati inattesi, ma va bene dove quel campo appare solo in una posizione del documento ed è una corrispondenza di uguaglianza.

Le versioni future (post 3.1 MongoDB) al momento della scrittura avranno $filterun'operazione più semplice:

db.collection.aggregate([
    { "$match": { "events.handled": 1 } },
    { "$project": {
        "events": {
            "$filter": {
                "input": "$events",
                "as": "event",
                "cond": { "$eq": [ "$$event.handled", 1 ] }
            }
        }
    }}
])

E tutte le versioni che supportano .aggregate()possono utilizzare il seguente approccio $unwind, ma l'uso di quell'operatore lo rende l'approccio meno efficiente a causa dell'espansione dell'array nella pipeline:

db.collection.aggregate([
    { "$match": { "events.handled": 1 } },
    { "$unwind": "$events" },
    { "$match": { "events.handled": 1 } },
    { "$group": {
        "_id": "$_id",
        "events": { "$push": "$events" }
    }}        
])

In tutti i casi in cui la versione MongoDB supporta un "cursore" dall'output aggregato, si tratta solo di scegliere un approccio e iterare i risultati con lo stesso blocco di codice mostrato per elaborare le istruzioni di aggiornamento collettivo. Le operazioni in blocco e i "cursori" dall'output aggregato sono introdotti nella stessa versione (MongoDB 2.6) e pertanto di solito lavorano insieme per l'elaborazione.

Anche nelle versioni precedenti è probabilmente meglio usare solo .find()per restituire il cursore e filtrare l'esecuzione delle istruzioni solo per il numero di volte in cui l'elemento array viene abbinato per le .update()iterazioni:

db.collection.find({ "events.handled": 1 }).forEach(function(doc){ 
    doc.events.filter(function(event){ return event.handled == 1 }).forEach(function(event){
        db.collection.update({ "_id": doc._id },{ "$set": { "events.$.handled": 0 }});
    });
});

Se sei assolutamente determinato a fare aggiornamenti "multi" o ritieni che ciò sia in definitiva più efficiente dell'elaborazione di più aggiornamenti per ciascun documento abbinato, puoi sempre determinare il numero massimo di possibili corrispondenze di array ed eseguire un aggiornamento "multi" che molti volte, fino a quando praticamente non ci sono più documenti da aggiornare.

Un approccio valido per le versioni MongoDB 2.4 e 2.2 potrebbe anche utilizzare .aggregate()per trovare questo valore:

var result = db.collection.aggregate([
    { "$match": { "events.handled": 1 } },
    { "$unwind": "$events" },
    { "$match": { "events.handled": 1 } },
    { "$group": {
        "_id": "$_id",
        "count": { "$sum": 1 }
    }},
    { "$group": {
        "_id": null,
        "count": { "$max": "$count" }
    }}
]);

var max = result.result[0].count;

while ( max-- ) {
    db.collection.update({ "events.handled": 1},{ "$set": { "events.$.handled": 0 }},{ "multi": true })
}

In ogni caso, ci sono alcune cose che non vuoi fare all'interno dell'aggiornamento:

  1. Non aggiornare "un colpo" l'array: dove, se si ritiene che potrebbe essere più efficiente aggiornare l'intero contenuto dell'array nel codice e quindi solo $setl'intero array in ciascun documento. Questo potrebbe sembrare più veloce da elaborare, ma non vi è alcuna garanzia che il contenuto dell'array non sia cambiato da quando è stato letto e viene eseguito l'aggiornamento. Sebbene $setsia ancora un operatore atomico, aggiornerà l'array solo con ciò che "ritiene" siano i dati corretti, e quindi è probabile che sovrascriva eventuali cambiamenti che si verificano tra lettura e scrittura.

  2. Non calcolare i valori dell'indice da aggiornare: Laddove simile all'approccio "one shot", devi solo capire che posizione 0e posizione 2(e così via) sono gli elementi per aggiornarli e codificarli con ed eventualmente un'istruzione come:

    { "$set": {
        "events.0.handled": 0,
        "events.2.handled": 0
    }}

    Ancora una volta il problema qui è la "presunzione" che quei valori dell'indice rilevati al momento della lettura del documento siano gli stessi valori dell'indice nell'array al momento dell'aggiornamento. Se nuovi elementi vengono aggiunti all'array in modo da modificare l'ordine, tali posizioni non sono più valide e gli articoli errati vengono infatti aggiornati.

Quindi fino a quando non viene determinata una sintassi ragionevole per consentire l'elaborazione di più elementi di array con corrispondenza in una singola istruzione di aggiornamento, l'approccio di base consiste nell'aggiornamento di ciascun elemento di matrice con corrispondenza in un'istruzione individuale (idealmente in blocco) o essenzialmente nell'elaborazione degli elementi di matrice massima per aggiornare o continuare l'aggiornamento fino a quando non vengono restituiti risultati più modificati. Ad ogni modo, dovresti "sempre" elaborare gli aggiornamenti posizionali$ sull'elemento array corrispondente, anche se si sta aggiornando solo un elemento per istruzione.

Le operazioni in blocco sono in realtà la soluzione "generalizzata" per l'elaborazione di qualsiasi operazione che si risolve in "operazioni multiple", e poiché ci sono più applicazioni per questo rispetto al semplice aggiornamento di elementi di array multipli con lo stesso valore, allora è stata ovviamente implementata già, ed è attualmente l'approccio migliore per risolvere questo problema.


8

Sono sorpreso che questo non sia ancora stato affrontato in mongo. Nel complesso mongo non sembra essere eccezionale quando si tratta di sotto-array. Non è possibile contare sotto-array semplicemente per esempio.

Ho usato la prima soluzione di Javier. Leggi l'array negli eventi, quindi esegui il ciclo continuo e crea il set exp:

var set = {}, i, l;
for(i=0,l=events.length;i<l;i++) {
  if(events[i].profile == 10) {
    set['events.' + i + '.handled'] = 0;
  }
}

.update(objId, {$set:set});

Questo può essere estratto in una funzione usando un callback per il test condizionale


Grazie per questo! Non riesco a credere che questa funzione non sia ancora supportata in modo nativo! Usato per incrementare ogni elemento di un subarray, per gli altri che leggono ... per aggiornare ogni elemento basta rimuovere l'istruzione if.
Zaheer,

9
Questa non è una soluzione sicura. Se un record viene aggiunto durante l'esecuzione dell'aggiornamento, i dati verranno danneggiati.
Merc

4

Ho cercato una soluzione a questo usando il driver più recente per C # 3.6 ed ecco la soluzione su cui alla fine ho deciso. La chiave qui sta usando "$ []" che secondo MongoDB è nuovo dalla versione 3.6. Vedi https://docs.mongodb.com/manual/reference/operator/update/positional-all/#up. S [] per ulteriori informazioni.

Ecco il codice:

{
   var filter = Builders<Scene>.Filter.Where(i => i.ID != null);
   var update = Builders<Scene>.Update.Unset("area.$[].discoveredBy");
   var result = collection.UpdateMany(filter, update, new UpdateOptions { IsUpsert = true});
}

Per ulteriori informazioni, consulta il mio post originale qui: Rimuovi l'elemento array da TUTTI i documenti utilizzando il driver MongoDB C #


4

Il thread è molto vecchio, ma sono venuto alla ricerca di una risposta qui fornendo quindi una nuova soluzione.

Con MongoDB versione 3.6+, ora è possibile utilizzare l'operatore posizionale per aggiornare tutti gli elementi in un array. Vedi la documentazione ufficiale qui .

La seguente query funzionerebbe per la domanda posta qui. Ho anche verificato con il driver Java-MongoDB e funziona correttamente.

.update(   // or updateMany directly, removing the flag for 'multi'
   {"events.profile":10},
   {$set:{"events.$[].handled":0}},  // notice the empty brackets after '$' opearor
   false,
   true
)

Spero che questo aiuti qualcuno come me.


1

Ho provato quanto segue e funziona perfettamente.

.update({'events.profile': 10}, { '$set': {'events.$.handled': 0 }},{ safe: true, multi:true }, callback function);

// funzione di callback in caso di nodejs


Questo codice aggiorna semplicemente il primo elemento corrispondente nell'array. Risposta sbagliata.
Hamlett

Funziona con v2.6. Potresti essere in una versione precedente? Ecco i suoi documenti docs.mongodb.com/manual/reference/method/db.collection.update/…
Jialin Zou,

1

Puoi aggiornare tutti gli elementi in MongoDB

db.collectioname.updateOne(
{ "key": /vikas/i },
{ $set: { 
 "arr.$[].status" : "completed"
} }
)

Aggiornerà tutto il valore "status" su "completato" nell'array "arr"

Se solo un documento

db.collectioname.updateOne(
 { key:"someunique", "arr.key": "myuniq" },
 { $set: { 
   "arr.$.status" : "completed", 
   "arr.$.msgs":  {
                "result" : ""
        }
   
 } }
)

Ma se non uno e anche tu non vuoi che tutti i documenti nell'array vengano aggiornati, devi scorrere l'elemento e all'interno del blocco if

db.collectioname.find({findCriteria })
  .forEach(function (doc) {
    doc.arr.forEach(function (singlearr) {
      if (singlearr check) {
        singlearr.handled =0
      }
    });
    db.collection.save(doc);
  });

0

In realtà, il comando save è solo sull'istanza della classe Document. Che hanno molti metodi e attributi. Quindi puoi usare la funzione lean () per ridurre il carico di lavoro. Fare riferimento qui https://hashnode.com/post/why-are-mongoose-mongodb-odm-lean-queries-faster-than-normal-queries-cillvawhq0062kj53asxoyn7j

Un altro problema con la funzione di salvataggio, che farà contemporaneamente entrare in conflitto i dati con il salvataggio multiplo. Model.Update renderà i dati coerentemente. Quindi, per aggiornare più elementi nella matrice del documento. Usa il tuo linguaggio di programmazione familiare e prova qualcosa del genere, io uso la mangusta in questo:

User.findOne({'_id': '4d2d8deff4e6c1d71fc29a07'}).lean().exec()
  .then(usr =>{
    if(!usr)  return
    usr.events.forEach( e => {
      if(e && e.profile==10 ) e.handled = 0
    })
    User.findOneAndUpdate(
      {'_id': '4d2d8deff4e6c1d71fc29a07'},
      {$set: {events: usr.events}},
      {new: true}
    ).lean().exec().then(updatedUsr => console.log(updatedUsr))
})

0

L'operatore $ [] seleziona tutti gli array nidificati. Puoi aggiornare tutti gli elementi dell'array con '$ []'

.update({"events.profile":10},{$set:{"events.$[].handled":0}},false,true)

Riferimento


Puoi per favore spiegare perché includi il "falso, vero" alla fine qui? Non riesco a trovarlo nella documentazione.
Garson,

Risposta errata all'operatore tutto posizionale $[] aggiorna solo tutti i campi dell'array specificato. Ciò che funziona è l'operatore di posizione filtrato $[identifier]che gli operatori sui campi dell'array soddisfano le condizioni specificate. Dovrebbe essere usato con RefrencearrayFilters : docs.mongodb.com/manual/release-notes/3.6/#arrayfilters e docs.mongodb.com/manual/reference/operator/update/…
Lawrence Eagles

0

Tieni presente che alcune risposte in questa discussione che suggeriscono di utilizzare $ [] sono ERRATE.

db.collection.update(
   {"events.profile":10},
   {$set:{"events.$[].handled":0}},
   {multi:true}
)

Il codice precedente aggiornerà "gestito" su 0 per tutti gli elementi nell'array "eventi", indipendentemente dal valore "profilo". La query {"events.profile":10}serve solo a filtrare l'intero documento, non i documenti dell'array. In questa situazione è un must da usare $[elem]con arrayFiltersper specificare la condizione di elementi di matrice così la risposta di Neil Lunn è corretta.


0

Aggiorna il campo dell'array in più documenti in mongo db.

Usa $ pull o $ push con aggiorna molte query per aggiornare gli elementi dell'array in mongoDb.

Notification.updateMany(
    { "_id": { $in: req.body.notificationIds } },
    {
        $pull: { "receiversId": req.body.userId }
    }, function (err) {
        if (err) {
            res.status(500).json({ "msg": err });
        } else {
            res.status(200).json({
                "msg": "Notification Deleted Successfully."
            });
        }
    });

0

Primo: il codice non ha funzionato perché si utilizzava l'operatore posizionale $che identifica solo un elemento da aggiornare in un array ma non specifica nemmeno esplicitamente la sua posizione nell'array.

Ciò di cui hai bisogno è l'operatore posizionale filtrato $[<identifier>]. Aggiornerebbe tutti gli elementi che corrispondono a una condizione di filtro dell'array.

Soluzione:

db.collection.update({"events.profile":10}, { $set: { "events.$[elem].handled" : 0 } },
   {
     multi: true,
     arrayFilters: [ { "elem.profile": 10 } ]
})

Visita mongodb doc qui

Cosa fa il codice:

  1. {"events.profile":10} filtra la tua raccolta e restituisce i documenti corrispondenti al filtro

  2. L' $setoperatore di aggiornamento: modifica i campi corrispondenti dei documenti su cui agisce.

  3. {multi:true}Rende .update()modificabili tutti i documenti corrispondenti al filtro, comportandosi così comeupdateMany()

  4. { "events.$[elem].handled" : 0 } and arrayFilters: [ { "elem.profile": 10 } ] Questa tecnica prevede l'uso dell'array posizionale filtrato con arrayFilters. l'array posizionale filtrato qui $[elem]funge da segnaposto per tutti gli elementi nei campi dell'array che corrispondono alle condizioni specificate nel filtro dell'array.

Filtri array

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.