2012-04-12 21 views
30

Tôi muốn đẩy thêm vào đầu tập hợp của mình thay vì được thêm vào cuối khi tôi thực hiện việc đẩy $ mongo.

Có thể thực hiện cập nhật đẩy nguyên tử để thêm phần tử làm phần tử đầu tiên thay vì phần tử cuối cùng không?


2014 cập nhật: yes you can.

+1

Xem http://stackoverflow.com/questions/ 10094573/use-mongodb-array-as-stack # comment12929388_10094573 –

+2

có thể trùng lặp [làm cách nào để thêm giá trị vào đầu một mảng trong mongodb?] (Http://stackoverflow.com/questions/7936019/how-do -i-add-a-giá trị-to-the-top-of-an-mảng-trong-mongodb) –

Trả lời

20

Tính đến MongoDB v2.5.3, có một $position điều hành mới mà bạn có thể bao gồm cùng với các nhà điều hành $each như một phần của truy vấn $push để chỉ định vị trí trong mảng mà bạn muốn chèn giá trị.

Dưới đây là một ví dụ từ trang tài liệu để thêm các yếu tố 20 và 30 tại chỉ số mảng của 2 ::

db.students.update({ _id: 1 }, 
        { $push: { scores: { 
             $each: [ 20, 30 ], 
             $position: 2 
             } 
          } 
        } 
       ) 

tham khảo: http://docs.mongodb.org/master/reference/operator/update/position/#up._S_position

+0

Thật vậy, điều này sẽ tốt đẹp khi họ đẩy bản phát hành ổn định 2.6. – lostintranslation

+2

Cú pháp '$ push - $ each - $ position: 0' là khó xử. Vui lòng giúp [triển khai $ unshift bằng cách bỏ phiếu cho vấn đề này] (https://jira.mongodb.org/browse/SERVER-19974). –

+0

Cũng chỉ hoạt động để cập nhật, đúng không? Thêm một mục MỚI vào mảng sẽ không hoạt động. – backdesk

5

Câu hỏi tương tự đã được hỏi cách đây vài ngày. Thật không may, câu trả lời ngắn gọn là "không", nhưng có một yêu cầu mở cho tính năng này.
https://jira.mongodb.org/browse/SERVER-2191 - "$ push() để phía trước của mảng"

Có một số thông tin cũng như một công việc xung quanh có thể trên các chủ đề khác: "mảng Sử dụng MongoDB như ngăn xếp" - Use MongoDB array as stack

Hy vọng ở trên sẽ hữu ích và giúp bạn tìm một công việc có thể chấp nhận được.

+0

Aha. Có vẻ như Chris Shain đã đánh tôi với cú đấm! Tôi không thấy nhận xét trước khi đăng. – Marc

+0

@Monkey: Kể từ v2.5.3, bạn có thể sử dụng cú pháp '$ push - $ each - $ position: 0'. Bạn có thể vui lòng cập nhật câu trả lời được chấp nhận không? Ngoài ra, vì cú pháp đó là khó xử, hãy giúp [triển khai $ unshift bằng cách bỏ phiếu về vấn đề này] (https://jira.mongodb.org/browse/SERVER-19974). –

25

Sử dụng chỉ số tiêu cực với $ đặt ra cho thêm vào trước, thử nghiệm trong Mongo v2.2:

> db.test.insert({'array': [4, 5, 6]}) 
> db.test.find() 
{ "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"), 
    "array" : [ 4, 5, 6 ] } 

//prepend 3 
> db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")}, 
       {'$set': {'array.-1':  3}}) 
> db.test.find() 
{ "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"), 
    "array" : [ 3, 4, 5, 6 ] } 

//prepend 2 
> db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")}, 
       {'$set': {'array.-1':  2}}) 
> db.test.find() 
{ "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"), 
    "array" : [ 2, 3, 4, 5, 6 ] } 

//prepend 1 
> db.test.update({"_id" : ObjectId("513ad0f8afdfe1e6736e49eb")}, 
       {'$set': {'array.-1':  1}}) 
> db.test.find() 
{ "_id" : ObjectId("513ad0f8afdfe1e6736e49eb"), 
    "array" : [ 1, 2, 3, 4, 5, 6 ] } 
+1

Giải pháp tuyệt vời! – ORL

+0

Có cách nào để đặt nhiều giá trị cho sự khởi đầu của mảng không? – Modi

+0

Giải pháp tuyệt vời. Hình như mongo 2.6 (ổn định) sẽ bao gồm một không làm việc xung quanh. – lostintranslation

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