Tôi có một tài liệu với một mảng bên trong, như thế này:
"userTags" : [
"foo",
"foo",
"foo",
"foo",
"moo",
"bar"
]
Nếu tôi thực hiện db.products.update({criteriaToGetDocument}, {$push: {userTags: "foo"}}}
tôi có thể chèn một cách chính xác một thể hiện của foo
vào mảng.
Tuy nhiên, nếu tôi làm db.products.update({criteriaToGetDocument}, {$pull: {userTags: "foo"}}}
sau đó nó loại bỏ tất cả trường hợp của foo
từ mảng, để lại tôi với:
"userTags" : [
"moo",
"bar"
]
này sẽ không làm gì cả, tôi chỉ muốn kéo một mục từ mảng thay vì tất cả chúng. Làm thế nào tôi có thể thay đổi lệnh để chỉ có một foo
bị xóa? Có một số loại phương thức $pullOnce
có thể hoạt động ở đây không?
Đây là ... rất khó chịu. Tôi giả sử một cách khác là thay đổi thiết kế dữ liệu của mình để 'userTags' là một đối tượng với' {tag: (numberofinstances) 'và chỉ tăng/giảm số này bất cứ khi nào cần thiết, nhưng tôi thực sự không làm điều đó vì nó messes với rất nhiều thứ khác! – Jascination
Tôi đồng ý với bạn. Dường như tính năng này thực sự hữu ích và không đọc tài liệu có thể hiểu sai ý tưởng về $ pull. Nhưng mọi người ở mongo đang làm một công việc tốt làm tăng tính năng của mongo trong mỗi lần phát hành. Vì vậy, tôi tin rằng một ngày bạn sẽ thấy điều này ra khỏi hộp. P.S. - bỏ phiếu cho tính năng trong JIRA. –
Chỉnh sửa đẹp. Bạn có thể đề xuất bất kỳ lệnh nào sẽ kiểm tra thẻ hiện có sau đó kiểm tra xem nó có lớn hơn một thẻ không? Hoặc tôi sẽ phải tìm xem liệu thẻ 'tag: {$ exist: true}' trong một lần tra cứu có thực hiện cập nhật với số thẻ mới không? – Jascination