2012-09-27 21 views
10

ho questi dati in Mongo:Aggiornare un elemento in sub di sub-array in MongoDB

{ 
    "_id" : ObjectId("505fd43fdbed3dd93f0ae088"), 
    "categoryName" : "Cat 1", 
    "services" : [ 
     { 
      "serviceName" : "Svc 1", 
      "input" : [ 
       { "quantity" : 10, "note" : "quantity = 10" }, 
       { "quantity" : 20, "note" : "quantity = 20" } 
      ] 
     }, 
     { 
      "serviceName" : "Svc 2", 
      "input" : [ 
       { "quantity" : 30, "note" : "quantity = 30" }, 
       { "quantity" : 40, "note" : "quantity = 40" } 
      ] 
     } 
    ] 
} 

Ora voglio aggiornare la quantità per "Svc 1":

{ "quantity" : 10, "note" : "quantity = 10" } 

come:

{"quantity": 100, "note": "changed to 100"} 

Come posso fare con Mongo? `

Come ho kno w, l'operatore operativo supporta solo il primo array, qualcuno ha consigliato di usare l'indice di un elemento del sotto-array secondario, ma il problema è che come può sapere quell'indice in fase di esecuzione? (Sto usando il driver C# nativo di MongoDB)

Grazie in anticipo per il vostro aiuto!

Johnny

risposta

10

Dal momento che si dispone di una matrice all'interno di un array, non v'è alcun modo semplice per fare riferimento alla sottoarray nidificato se non si conosce la posizione della matrice che si desidera aggiornare.

Così, per esempio, è possibile aggiornare il primo ingresso per 'Svc 1' con il C# equivalente di:

db.services.update(

    // Criteria 
    { 
     '_id' : ObjectId("505fd43fdbed3dd93f0ae088"), 
     'services.serviceName' : 'Svc 1' 
    }, 

    // Updates 
    { 
     $set : { 
      'services.$.input.0.quantity' : 100, 
      'services.$.input.0.note' : 'Quantity updated to 100' 
     } 
    } 
) 

Se non si conosce la posizione per la nidificato input matrice, si avrà per recuperare l'abbinamento services, iterare l'array input nel codice dell'applicazione, quindi $set l'array aggiornato.

In alternativa, è possibile modificare l'array nidificato per usare un documento incorporato, invece, ad esempio:

{ 
    "categoryName" : "Cat 1", 
    "services" : [ 
     { 
      "serviceName" : "Svc 1", 
      "input1" : { "quantity" : 10, "note" : "quantity = 10" }, 
      "input2" : { "quantity" : 20, "note" : "quantity = 20" } 
     }, 
    ] 
} 

cui si potrebbe quindi aggiornare in base al nome, ad esempio input1:

db.services.update(

    // Criteria 
    { 
     '_id' : ObjectId("5063e80a275c457549de2362"), 
     'services.serviceName' : 'Svc 1' 
    }, 

    // Updates 
    { 
     $set : { 
      'services.$.input1.quantity' : 100, 
      'services.$.input1.note' : 'Quantity updated to 100' 
     } 
    } 
) 
+0

Ci è una richiesta correlata [SERVER-267] (https://jira.mongodb.org/browse/SERVER-267) (supporto jolly parziale) nel tracker dei problemi di MongoDB. – Stennie

+0

Grazie per il tuo aiuto, Stennie! Attualmente raggruppo l'array di input e output in un'altra raccolta come soluzione alternativa. – Johnny

5

Dal momento che si don' Per conoscere la posizione del valore che si desidera aggiornare, prima inserire un nuovo valore con le informazioni aggiornate e quindi rimuovere il valore desiderato per l'aggiornamento.

db.services.update(
    { 
    '_id' : ObjectId("505fd43fdbed3dd93f0ae088"), 
    'services.serviceName' : 'Svc 1' 
    }, 
    { 
    { $addToSet: { 'services.$.input' : "new sub-Doc" } 
    } 
) 

e quindi rimuovere quando inserto è successo

db.services.update(
    { 
    '_id' : ObjectId("505fd43fdbed3dd93f0ae088"), 
    'services.serviceName' : 'Svc 1' 
    }, 
    { 
    { $pull: { 'services.$.input' : { "quantity" : 10, "note" : "quantity = 10" } } 
    } 
) 

Questo è utile quando l'indice non è noto e il documento dovrebbe avere sotto-documenti con stessa chiave come "input" in post Update an element in sub of sub array in mongodb

+3

Questo è stato utile. Ora sto passando a MySql. Grazie. – JSideris

Problemi correlati