2012-03-09 39 views
12

Hiện tại đang theo dõi Mongoose và MongoDB cho một dự án của tôi nhưng đi qua một đoạn mà API không rõ ràng.Giá trị mảng duy nhất trong Mongoose

Tôi có một Mô hình chứa một số khóa và tài liệu và một trong số các khóa này được gọi là watchList. Đây là một mảng ID mà người dùng đang xem, Nhưng tôi cần đảm bảo rằng các giá trị này vẫn duy trì.

Dưới đây là một số mẫu mã:

var MyObject = new Mongoose.Schema({ 
    //.... 
    watching : {type: Array, required: false}, 
    //.... 
}); 

Vì vậy, câu hỏi của tôi là làm thế nào tôi có thể chắc chắn rằng các giá trị bị đẩy vào mảng duy nhất lưu trữ một, vì vậy làm cho giá trị duy nhất, tôi có thể chỉ cần sử dụng unique: true?

Cảm ơn

Trả lời

14

Theo hiểu biết của tôi, cách duy nhất để thực hiện điều này trong mongoose là gọi người điều hành Mongo bên dưới (mentioned by danmactough). Trong cầy mangut, mà muốn trông giống như:

var idToUpdate, theIdToAdd; /* set elsewhere */ 
Model.update({ _id: idToUpdate }, 
      { $addToSet: { theModelsArray: theIdToAdd } }, 
      function(err) { /*...*/ } 
); 

Lưu ý: Chức năng này đòi hỏi phiên bản mongoose> = 2.2.2

+3

có thể * theIdToAdd * là một mảng, chẳng hạn như '[" ID1 "," ID2 "]'? – RobertPitt

+2

Tôi đoán bạn có thể sử dụng $ mỗi cái cho điều đó. –

+2

@RoberPitt xuất sắc điểm ... theIdToAdd không thể là một mảng. Nếu bạn làm điều đó, mục sẽ được chèn vào sẽ là mảng đó. Tôi đang cố gắng tìm cách để giải quyết vấn đề này :-( – superiggy

6
+0

Vì vậy, $ addToSet sẽ thêm phần tử mới vào mảng nếu nó không chứa bản sao. Có cách nào (ví dụ: tạo chỉ mục duy nhất), điều này sẽ đảm bảo không bao giờ được sao chép trong một mảng? Về cơ bản, tôi muốn một Set thay vì một Sequence. –

1

Mongoose là một mô hình đối tượng cho MongoDB, vì vậy một lựa chọn là để điều trị các tài liệu như một đối tượng javascript bình thường.

MyModel.exec(function (err, model) { 
    if(model.watching.indexOf(watchId) !== -1) model.watching.push(watchId); 

    model.save(...callback); 
}); 

Mặc dù, tôi không đồng ý mongoose rằng nên có một số hỗ trợ cho việc này được xây dựng theo hình thức một validator cho collection document reference feature - đặc biệt là bởi vì hầu hết thời gian bạn muốn thêm tài liệu tham khảo chỉ độc đáo.

+2

Điều này đã thắng không hoạt động nếu tập hợp đã được thêm vào mô hình bằng một phép toán đồng thời, và trong ví dụ của bạn, bạn sẽ kiểm tra xem tập hợp đó có tồn tại trong một bản sao cũ của mô hình hay không. – ninja123

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