2012-12-21 45 views
36

Tôi đã doc sau lưu trữ trong MongoDB:Cách chèn phần tử vào danh sách nội bộ MongoDB?

{ 
    name: 'myDoc', 
    list: [ 
     { 
      id:1 
      items:[ 
       {id:1, name:'item1'}, 
       {id:2, name:'item2'} 
      ] 
     }, 
     { 
      id:2 
      items:[ 
       {id:1, name:'item1'}, 
       {id:3, name:'item3'} 
      ] 
     } 
    ] 
} 

Tôi tìm thấy một cách để thêm một yếu tố để 'danh sách' sử dụng $addToSet nhưng tôi không thể tìm thấy một cách để thêm vào một danh sách cụ thể của 'mục' một mon đô.

ví dụ: Tôi nhận được các thông tin sau:

{id:5, name:'item5'} 

và tôi muốn thêm nó vào mục của phần tử trong danh sách có id: 2.

Trả lời

32

Một cách để làm nó sẽ được với $push:

db.col.update(
    { name: 'doc', 'list.id': 2 }, 
    {$push: {'list.$.items': {id: 5, name: 'item5'}}} 
) 

http://docs.mongodb.org/manual/reference/operator/push/

Bạn cũng có thể thay thế $push với những hoạt động khác như (có thể) $addToSet để có được kết quả chính xác mà bạn đang tìm kiếm.

11

Bạn có thể sử dụng: -

> var toInsert = {id: 5, name: 'item6'} 
> db.abc.update(
      { name: 'myDoc', list: { $elemMatch: { id: 2 } } }, 
      { $addToSet: { 'list.$.items': toInsert } } 
) 

Phần query sẽ tìm thấy những tài liệu từ mảng list với id = 2. Sau đó, chúng tôi sử dụng $ yếu tố vị trí để thêm phần tử mới vào chỉ mục mảng đó.

Xem positional $ operator


Bạn cũng có thể thay thế list: {$elemMatch: {id: 2}} chỉ với 'list.id': 2.

Nhưng việc sử dụng $elemMatch sẽ tốt hơn, khi bạn muốn cập nhật dựa trên nhiều yếu tố trong mảng của mình. Đối với ví dụ, khi các tiêu chí phù hợp với bạn là id và một số lĩnh vực khác trong mảng nói length: -

list: {$elemMatch: {id: 2, length: 5}} 
+0

Footnote, schemas với mảng nhúng lồng nhau được hầu như luôn luôn sẽ gây ra vấn đề sau vì không phải tất cả các hoạt động trên các yếu tố mức độ thấp hơn là có thể với ngôn ngữ truy vấn hiện tại. Tôi sẽ tránh nó. –

Các vấn đề liên quan