2012-08-15 56 views
29

Tôi cần phải đẩy nhiều giá trị vào một mảng trong mongoose bằng một cuộc gọi. Tôi đã thử làm điều đó bằng cách sử dụng một mảng nhỏ hơn nhưng mảng được đưa vào như là một mảng phụ.Làm thế nào để đẩy một mảng các đối tượng vào một mảng trong mongoose với một cuộc gọi?

var kittySchema = new mongoose.Schema({ 
     name: String, 
     values: [Number] 
}); 

var Kitten = db.model('Kitten', kittySchema); 
Kitten.update({name: 'fluffy'},{$push: {values:[2,3]}},{upsert:true},function(err){ 
     if(err){ 
       console.log(err); 
     }else{ 
       console.log("Successfully added"); 
     } 
}); 

Kết quả của cách gọi mã trên ba lần cho kết quả dưới đây:

{ "_id" : ObjectId("502b0e807809d79e84403606"), "name" : "fluffy", "values" : [ [ 2, 3 ], [ 2, 3 ], [ 2, 3 ] ] } 

Trong khi những gì tôi muốn là một cái gì đó như thế này:

{ "_id" : ObjectId("502b0e807809d79e84403606"), "name" : "fluffy", "values" : [ 2, 3 ,2 ,3, 2, 3] } 

Một điều tôi nhận thấy là loại trong mảng (giá trị) được xác định là số, sau đó sẽ không tùy chọn 'nghiêm ngặt' đảm bảo rằng bất cứ điều gì khác hơn số không được chèn vào? Trong trường hợp này, một mảng khác được phép chèn vào.

Trả lời

39

Không dùng nữa thấy giải pháp khác dưới đây sử dụng $ push $ mỗi

dụ của bạn là gần, nhưng bạn muốn $pushAll hơn $push để có mỗi giá trị gia tăng riêng (chứ không phải là đẩy mảng khác vào mảng values):

var Kitten = db.model('Kitten', kittySchema); 
Kitten.update({name: 'fluffy'},{$pushAll: {values:[2,3]}},{upsert:true},function(err){ 
     if(err){ 
       console.log(err); 
     }else{ 
       console.log("Successfully added"); 
     } 
}); 
+16

NB: bạn cũng có thể muốn xem xét [$ addToSet] (http: // www .mongodb.org/display/DOCS/Updating/# Updating-% 24addToSetand% 24each), có thể được sử dụng để chỉ thêm các giá trị vào một mảng nếu chúng chưa có. – Stennie

+0

Cảm ơn Stennie! Điều đó hoạt động. Tôi đã bỏ lỡ phần này trong tài liệu. –

+0

@Stennie này chỉ hoạt động cho các phần tử riêng lẻ, không phải cho các mảng nối. – Tom

20

(cập nhật Dec-2014) Kể từ MongoDB2.4 bạn nên sử dụng:

Kitten.update({name: 'fluffy'}, {$push: {values: {$each: [2,3]}}}, {upsert:true}, function(err){ 
     if(err){ 
       console.log(err); 
     }else{ 
       console.log("Successfully added"); 
     } 
}); 
+0

Nếu không có tài liệu với '{name:" fluffy "}' trong nó tồn tại, không '{upsert: true}' tạo nó ?; Ngoài ra, nếu tôi làm '{upsert: true, new: true}', tôi có thể thực hiện chức năng (err, result) {} và nhận được kết quả tất cả các tài liệu đã được tạo/cập nhật không? – Besto

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