2015-11-20 14 views
15

Ho una collezione:Come accodare nuovo documento in complicate Collection-Object

{ 
    "_id": ObjectId("503b83dfad79cc8d26000004"), 
    "uid": "9a8a2c5b9418cc1baadfa41255791414", 
    "link": "http://stackoverflow.com/questions", 
    "tasks": [ 
     { 
     "query": "lorem lorem", 
     "list": [ 
      { 
      "timestamp": "159", 
      "provider": "Lor Em" 
      } 
     ] 
     } 
    ] 
} 

Ogni elemento raccolta costituiti gamma di compiti. Ogni elemento TASK è costituito da Query + List-array.

devo aggiungo, se è possibile nuovo TASK[index].LIST-object (vedi schema)

enter image description here

Ma non riesco a capire, come posso controllare tutto in CASE_TO_FIND_ELEMENT:

db.myCollection.update(
    {<CASE_TO_FIND_ELEMENT>}, 
    { 
     $push: { 
      list: { 
       timestamp: "1233", 
       provider: "myNewProvier" 
      }     
     } 
    }, 
    { 
     upsert: true, 
     multi: false 
    } 
) 

Aggiornamento:
newQuery -> any string (ad esempio dal server) per l'utilizzo in document.tasks[index].query
Questi valori faccio nel mio codice e devono controllare se esistono nel DB:
uid + link + (query + (TIMESTAMP + PROVIDER))


Aggiornamento v2

> db.demo.find().pretty() 
{ 
    "_id" : ObjectId("564f04f4be5d6f2f98c77dcd"), 
    "uid" : "id3", 
    "task" : [ 
      { 
        "list" : { 
          "lid" : "lX", 
          "ltext" : "demoX" 
        } 
      } 
    ] 
} 

Cerca UID == "id3" e task-array in lista- array "lid" == "lX" e, se non trovato, invia nuovo documento in task.list-array:

db.demo.update({ 
    "uid": "id3", 
    "task.list.lid": "lX" 
}, { 
    $push: { 
     "task": { 
      "list": { 
       "lid": "lX2", 
       "ltext": "demoX2" 
      } 
     } 
    } 
}, true, false) 

Ma in questo caso Mongo inserire un nuovo documento in ordine :(

> db.demo.find().pretty() 
{ 
     "_id" : ObjectId("564f04f4be5d6f2f98c77dcd"), 
     "uid" : "id3", 
     "task" : [ 
       { 
         "list" : { 
           "lid" : "lX", 
           "ltext" : "demoX" 
         } 
       }, 
       { 
         "list" : { 
           "lid" : "lX2", 
           "ltext" : "demoX2" 
         } 
       }, 
       { 
         "list" : { 
           "lid" : "lX2", 
           "ltext" : "demoX2" 
         } 
       } 
     ] 
} 

mi potete aiutare prego per aggiungere alcuni dati nella collezione MongoDB? Grazie!

+0

Si può elaborare quello che 'NewQuery + ecc' è? – chridam

+0

@chridam: Ho aggiornato la mia domanda –

risposta

0

È possibile utilizzare $addToSet. Questo verrà aggiunto all'array solo se non esiste già. Ad esempio:

Prima aggiornamento:

{ 
    "_id" : ObjectId("564f04f4be5d6f2f98c77dcd"), 
    "uid" : "id3", 
    "task" : [ 
      { 
        "list" : { 
          "lid" : "lX", 
          "ltext" : "demoX" 
        } 
      } 
    ] 
} 

Poi fare l'aggiornamento:

db.demo.update({ 
    "uid": "id3", 
    "task.list.lid": "lX" 
}, { 
    $addToSet: { 
     "task": { 
      "list": { 
       "lid": "lX2", 
       "ltext": "demoX2" 
      } 
     } 
    } 
}, true, false) 

Dopo primo aggiornamento:

{ 
     "_id" : ObjectId("564f04f4be5d6f2f98c77dcd"), 
     "uid" : "id3", 
     "task" : [ 
       { 
         "list" : { 
           "lid" : "lX", 
           "ltext" : "demoX" 
         } 
       }, 
       { 
         "list" : { 
           "lid" : "lX2", 
           "ltext" : "demoX2" 
         } 
       } 
     ] 
} 

Dopo secondo aggiornamento:

{ 
     "_id" : ObjectId("564f04f4be5d6f2f98c77dcd"), 
     "uid" : "id3", 
     "task" : [ 
       { 
         "list" : { 
           "lid" : "lX", 
           "ltext" : "demoX" 
         } 
       }, 
       { 
         "list" : { 
           "lid" : "lX2", 
           "ltext" : "demoX2" 
         } 
       } 
     ] 
} 
+0

Grazie per la risposta. Ma "elenco" nel mio caso è un array. È possibile aggiornare senza il controllo di 2 modi? –

+0

@ElderovAli Nella tua domanda 'elenco' non è un array. Non sono chiaro su quello che stai chiedendo –

+0

Nella mia domanda: la lista è array, vedi sul lato superiore. Tutto quello che ho in Update-section è il massimo di ciò che posso fare senza creare liste come array. :( –

1

Indovinare ciò che si desidera.

Questo è il documento originale

{"_id": ObjectId("503b83dfad79cc8d26000004"), 
"uid": "9a8a2c5b9418cc1baadfa41255791414", 
"link": "http://stackoverflow.com/questions", 
"tasks": [ 
    { 
    "query": "lorem lorem", 
    "list": [ 
     { 
     "timestamp": "159", 
     "provider": "Lor Em" 
     } 
    ] 
    } 
]} 

si può fare questo:

db.demo.update({"tasks": { $elemMatch: { "query": "lorem lorem" }}}, {$push: {"tasks.$.list": {"timestamp": "160", "provider": "Lor Em"}}}); 

e avrete questo nel documento aggiornato:

{"_id" : ObjectId("588b8ff15a66b2e3316ce70a"), 
"uid" : "9a8a2c5b9418cc1baadfa41255791414", 
"link" : "http://stackoverflow.com/questions", 
"tasks" : [ 
    { 
     "query" : "lorem lorem", 
     "list" : [ 
      { 
       "timestamp" : "159", 
       "provider" : "Lor Em" 
      }, 
      { 
       "timestamp" : "160", 
       "provider" : "Lor Em" 
      } 
     ] 
    } 
]} 
Problemi correlati