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

MongoDb aggiorna l'oggetto in una matrice alla prima occorrenza dall'ultima

Comprendo ciò che stai dicendo in quanto desideri abbinare l'ultimo elemento in questo caso o effettivamente elaborare la corrispondenza in ordine inverso. Non è possibile modificare questo e l'indice archiviato nel posizionale $ l'operatore sarà sempre la "prima" corrispondenza.

Ma puoi cambiare il tuo approccio a questo, come il comportamento predefinito di $push è "aggiungere" alla fine dell'array. Ma MongoDB 2.6 ha introdotto un $position modificatore in modo da poter sempre "anteporre" all'array, il che significa che il tuo elemento "più vecchio" è alla fine.

Prendi questo ad esempio:

db.artest.update(
   { "array": { "$in": [5] } },
   { "$push": { "array": { "$each": [5], "$position": 0 } }},
   { "upsert": true }
)

db.artest.update(
    { "array": { "$in": [5] } },
    { "$push": { "array": { "$each": [6], "$position": 0 } }},
    { "upsert": true }
)

Ciò si traduce in un documento che è il "rovescio" del normale $push comportamento:

{ "_id" : ObjectId("53eaf4517d0dc314962c93f4"), "array" : [ 6, 5 ] }

In alternativa puoi applicare il $sort modificatore durante l'aggiornamento dei documenti per "ordinare" gli elementi in modo che fossero invertiti. Ma potrebbe non essere l'opzione migliore se vengono archiviati valori duplicati.

Quindi cerca di memorizzare i tuoi array in "reverse" se intendi abbinare "prima" gli elementi "più recenti". Attualmente questo è l'unico modo per ottenere il tuo comportamento "corrispondenza dall'ultimo".