2015-11-20 12 views
15

Tôi có một bộ sưu tập:Làm thế nào thêm tài liệu mới trong phức tạp Collection-Object

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

Mỗi phần tử bộ sưu tập bao gồm hàng loạt các nhiệm vụ. Mỗi phần tử TASK bao gồm Query + List-array.

tôi phải nối thêm nếu có thể mới TASK[index].LIST-object (xem sơ đồ)

enter image description here

Nhưng tôi không thể hiểu được, làm sao tôi có thể kiểm tra tất cả trong CASE_TO_FIND_ELEMENT:

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

Cập nhật:
newQuery -> any string (ví dụ từ máy chủ) để sử dụng trong document.tasks[index].query
giá trị này tôi thực hiện trong mã của tôi và phải kiểm tra nếu chúng tồn tại trong DB:
uid + link + (query + (TIMESTAMP + PROVIDER))


Cập nhật v2

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

Tìm kiếm UID == "id3" và trong nhiệm vụ mảng trong list- mảng "lid" == "lX" và nếu không tìm thấy, hãy đẩy tài liệu mới vào task.list-array:

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

Nhưng trong trường hợp này Mongo chèn một doc mới trong mảng :(

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

bạn có thể giúp tôi xin vui lòng để thêm một số dữ liệu trong bộ sưu tập MongoDB? Cảm ơn bạn!

+0

bạn có thể xây dựng những gì 'newQuery + etc' là? – chridam

+0

@chridam: Tôi đã cập nhật câu hỏi của mình –

Trả lời

0

Bạn có thể sử dụng $addToSet. Điều đó sẽ chỉ phụ thêm vào mảng nếu nó chưa tồn tại. Ví dụ:

Trước khi update:

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

Sau đó làm việc cập nhật:

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

Sau khi cập nhật đầu tiên:

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

Sau khi cập nhật thứ hai:

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

Cảm ơn bạn đã trả lời. Nhưng "danh sách" trong trường hợp của tôi là một mảng. Có thể cập nhật mà không cần kiểm tra 2 cách không? –

+0

@ElderovAli Trong câu hỏi của bạn 'danh sách' không phải là một mảng. Tôi không rõ ràng về những gì bạn đang yêu cầu –

+0

Trong câu hỏi của tôi: danh sách là mảng, xem trên đầu trang. Tất cả những gì tôi có trong Update-section là tối đa những gì tôi có thể làm mà không cần tạo danh sách dưới dạng mảng. :( –

1

đoán những gì bạn muốn.

Đây là tài liệu gốc

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

bạn có thể làm điều này:

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

Và bạn sẽ có điều này trong tài liệu cập nhật của bạn:

{"_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" 
      } 
     ] 
    } 
]} 
Các vấn đề liên quan