2015-11-20 12 views
15

Mam kolekcję:Jak dołączyć nowy dokument w skomplikowanej Collection-Object

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

Każdy element kolekcji składać szereg zadań. Każdy element TASK składa się z Query + List-array.

muszę dołączyć, jeśli jest to możliwe nowa TASK[index].LIST-object (patrz schemat)

enter image description here

Ale nie mogę zrozumieć, w jaki sposób mogę sprawdzić wszystko w CASE_TO_FIND_ELEMENT:

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

Aktualizacja:
newQuery -> any string (na przykład z serwera) do używania w document.tasks[index].query
Te wartości robię w moim kodu i należy sprawdzić, czy występują one w DB:
uid + link + (query + (TIMESTAMP + PROVIDER))


UPDATE v2

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

Wyszukiwanie UID == "id3" aw zadań-tablicy w listy- array "lid" == "lX", a jeśli nie zostanie znaleziony, naciśnij nowy dokument w polu task.list-array:

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

Ale w tym przypadku Mongo wstawić nowy dokument w tablicy :(

> 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" 
         } 
       } 
     ] 
} 

możesz mi pomóc proszę dodać jakieś dane w kolekcji MongoDB? Dziękujemy!

+0

można opracowania co 'NewQuery + etc "jest? – chridam

+0

@chridam: Zaktualizowałem moje pytanie –

Odpowiedz

0

Można użyć $addToSet. To będzie tylko dołączyć do tablicy, jeśli jeszcze nie istnieje. Na przykład:

przed aktualizacją:

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

Następnie wykonaj aktualizację:

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

Po pierwszej aktualizacji:

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

Po drugiej aktualizacji:

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

Dziękuję za odpowiedź. Ale "lista" w moim przypadku jest tablicą. Czy można aktualizować bez 2 sposobów sprawdzenia? –

+0

@ElderovAli W pytaniu 'lista' nie jest tablicą. Nie jestem pewien, o co pytasz. –

+0

Na moje pytanie: lista to tablica, patrz na górze strony. Wszystko, co mam w dziale Update, to maksimum tego, co mogę zrobić bez tworzenia listy jako tablicy. :( –

1

odgadywanie, co chcesz.

Jest to oryginalny dokument

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

można to zrobić:

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

i trzeba będzie to w zaktualizowanym dokumencie:

{"_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" 
      } 
     ] 
    } 
]} 
Powiązane problemy