2015-01-10 29 views
5

Tôi có một bộ sưu tập lưu trữ tài liệu của một vài sản phẩm. Trong tài liệu, có một mảng evaluation để lưu trữ các đối tượng đánh giá giá của người dùng trên một sản phẩm.

Dưới đây là một ví dụ về đối tượng sử dụng:

var data = {user_id:90,price:400} 

bất cứ ai có thể cho tôi biết nếu nó có thể làm một "Chèn vào cập nhật bản sao" trên mảng evaluation? Tôi đã cố gắng $addToSet, nhưng khi một đối tượng được đẩy vào evaluation, có một tài sản được bổ sung vào đối tượng người dùng _id, mặc dù tôi không có nó trong mô hình, như thế này:

{ 
    "_id": 54b13f52604fc5d242d4aa68, 
    "__v": NumberInt(0), 
    "evaluation": [ 
    { 
     "price": NumberInt(14616), 
     "user_id": NumberInt(91), 
     "_id": ObjectId("54b13f5e604fc5d242d4aa6b") // Why is it added? 
    }, 
    { 
     "price": NumberInt(16211), 
     "user_id": NumberInt(92), 
     "_id": ObjectId("54b140d1604fc5d242d4aa74") // 
    } 
    ], 
    "product": [ 
    { 
     "title": "ABC", 
     "model_id": "382", 
     "id": "513", 
     "category": "1", 
     "src": "xxx.jpg" 
    } 
    ], 
    "timestamp":ISODate("2015-01-10T15:03:46.310Z") 
} 

Là cách $addToSet hoạt động như thế nào để sử dụng trường id để kiểm tra đối tượng trùng lặp?

model.js

var evaluation = new mongoose.Schema({ 
     product:[], 
     timestamp : { type : Date, default: Date.now }, 
     evaluation:[{user_id:Number,price:Number}], 
},{strict:false}); 

var models = { 
     Eva:mongoose.model('Evaluation',evaluation) 
    }; 

app.js

var mongo_models = require('./db/mongo_model')(mongoose); 
Eva = mongo_models.Eva; 

io.on('connection', function(socket){ 
    socket.on("evaluation",function(d){ 
    var data = {user_id:user_id,price:d.price}; 
    Eva.update({_id:d.tid},{$addToSet:{evaluation:data}}).exec(); 
    }) 
}) 
+3

Thêm '{_id: false}' vào lược đồ của bạn ema, theo cách đó, con điếm sẽ không tạo ra '_id' cho các tài liệu phụ. - http://stackoverflow.com/questions/17254008/stop-mongoose-from-created-ids-for-subdocument-arrays – BatScream

+0

câu hỏi ban đầu cần phải xác định vấn đề mà họ đang cố giải quyết –

Trả lời

4

Bạn có thể ngăn Mongoose từ việc thêm một lĩnh vực _id đến evaluation phần tử mảng bằng cách tuyên bố một lược đồ nội tuyến cho các yếu tố và vô hiệu hóa _id:

var evaluation = new mongoose.Schema({ 
    product:[], 
    timestamp : { type : Date, default: Date.now }, 
    evaluation:[Schema({user_id:Number,price:Number}, {_id: false})], 
},{strict:false}); 
Các vấn đề liên quan