Tôi đã đọc tài liệu trong MongoDB và tôi đã sử dụng một chứng minh đơn giản và tôi chỉ nhìn rằng: Push đang phân loại mảng nhưng addtoSet
không phải là nó.
Đối với tôi trực quan là như nhau, tôi không biết sự khác biệt.
Bất cứ ai có thể giải thích cho tôi sự khác biệt?
Một suy nghĩ khác nếu nó có thể bằng tiếng Tây Ban Nha hoặc bằng tiếng Anh đơn giản, tôi sẽ aprecite nó.
Người xử lý
6.1214 Huy hiệu vàng29 Huy hiệu bạc38 Huy hiệu đồng4 gold badges29 silver badges38 bronze badges
Đã hỏi ngày 2 tháng 12 năm 2014 lúc 11:41Dec 2, 2014 at 11:41
1
$addToSet
Không thêm mục vào trường đã cho nếu nó đã chứa nó, mặt khác, $push
sẽ thêm đối tượng đã cho vào trường cho dù nó có tồn tại hay không.
{_id: "docId", items: [1, 2]}
db.items.update[{_id:"docId"}, {$addToSet:{items: 2}}]; // This won't update the document as it already contains 2
db.items.update[{_id:"docId"}, {$push: {items:2}}]; // this will update the document. new document {_id: "docId", items:[1,2,2]}
Kaspar Lee
5.3364 Huy hiệu vàng30 Huy hiệu bạc54 Huy hiệu Đồng4 gold badges30 silver badges54 bronze badges
Đã trả lời ngày 2 tháng 12 năm 2014 lúc 11:47Dec 2, 2014 at 11:47
Cubbukcubbukcubbuk
7.7104 Huy hiệu vàng34 Huy hiệu bạc62 Huy hiệu Đồng4 gold badges34 silver badges62 bronze badges
2
$ Push - Thêm các mục theo thứ tự mà chúng đã được nhận. Ngoài ra, bạn có thể thêm các mục giống nhau nhiều lần. - adds items in the order in which they were received. Also you can add same items several times.
$ Addtoset - Thêm các mục duy nhất, nhưng thứ tự của các mặt hàng không được đảm bảo. - adds just unique items, but order of items is not guaranteed.
Nếu bạn cần thêm các mục duy nhất theo thứ tự, bạn có thể nhóm và thêm các phần tử thông qua $ Addtoset, sau đó $ Du khóa mảng với các phần tử, $ Sắp xếp theo các mục và sau đó làm lại $ Group với $ Push Items.
Đã trả lời ngày 29 tháng 12 năm 2017 lúc 10:15Dec 29, 2017 at 10:15
0
Bên cạnh sự khác biệt mà những người khác đã đề cập
$push
: nối một đối tượng vào một mảng$addToSet
: Thêm một đối tượng vào một mảng nếu nó không tồn tại
Có một sự khác biệt trong sao chép. [Điều này có thể được nhìn thấy nếu bằng cách xem local.oplog.rs
]
- Các hoạt động
$push
[thực sự sửa đổi mảng] được sao chép là
1db.items.updateOne[ {_id: 'my-id', 'items': {'$ne': 'items1'}, {'$push': { 'items': 'item1', }} ] db.items.updateOne[ {_id: 'my-id'}, {'$addToSet': { 'items': 'item1', }} ]
- Các hoạt động
$addToSet
[thực sự sửa đổi mảng] được sao chép là
3db.items.updateOne[ {_id: 'my-id', 'items': {'$ne': 'items1'}, {'$push': { 'items': 'item1', }} ] db.items.updateOne[ {_id: 'my-id'}, {'$addToSet': { 'items': 'item1', }} ]
Nếu bạn đang xử lý các mảng lớn, thì sự khác biệt có thể là đáng kể
Vì vậy, trong khi một cái gì đó như [trường hợp sử dụng điển hình để duy trì mảng duy nhất]
db.items.updateOne[
{_id: 'my-id', 'items': {'$ne': 'items1'},
{'$push': {
'items': 'item1',
}}
]
db.items.updateOne[
{_id: 'my-id'},
{'$addToSet': {
'items': 'item1',
}}
]
Có thể kết thúc với cùng một tài liệu kết quả, có một sự khác biệt trong hoạt động được sao chép.
Đã trả lời ngày 1 tháng 3 năm 2019 lúc 9:49Mar 1, 2019 at 9:49
Allan Leiallan LeiAllan Lei
3083 Huy hiệu bạc4 Huy hiệu đồng3 silver badges4 bronze badges
$ Addtoset và $ Push cũng làm điều tương tự, tuy nhiên $ Push chỉ thúc đẩy bất kỳ mục nào coi thường việc trùng lặp gây ra sự dư thừa. Trước đây chỉ đẩy các mặt hàng độc đáo, không sao chép.
dat3450
9543 Huy hiệu vàng12 Huy hiệu bạc27 Huy hiệu đồng3 gold badges12 silver badges27 bronze badges
Đã trả lời ngày 3 tháng 7 năm 2017 lúc 2:31Jul 3, 2017 at 2:31
RemarioremarioRemario
3.7412 Huy hiệu vàng18 Huy hiệu bạc25 Huy hiệu đồng2 gold badges18 silver badges25 bronze badges
Như tên đề xuất $ addtoset [set] sẽ không cho phép trùng lặp trong khi $ push chỉ cần thêm phần tử vào mảng
Đã trả lời ngày 4 tháng 9 năm 2017 lúc 15:43Sep 4, 2017 at 15:43
Vipul Pandeyvipul PandeyVipul Pandey
1.29110 Huy hiệu bạc19 Huy hiệu đồng10 silver badges19 bronze badges
$ Push: Chèn giá trị vào một mảng trong tài liệu kết quả. ví dụ;
db.mycol.aggregate[[{$group : {_id : "$by_user", url : {$push: "$url"}}}]]
$ Addtoset: Chèn giá trị vào một mảng trong tài liệu kết quả nhưng không tạo sao chép. ví dụ;
db.mycol.aggregate[[{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]]
Đã trả lời ngày 15 tháng 7 năm 2018 lúc 7:46Jul 15, 2018 at 7:46