2016-04-20 2 views
1

Моего сценария, если person1 принимать person2 сделки means..the person1_id сохранит внутри этой области acceptedperson2 частности deal, я попробовал код он работал отлично, если принято пользователь (PERSON2) имеет одну сделки, но в случае более чем одной сделки он обновлял, но удалял другие сделки (т. е. предположил, что person2, имея 3 сделки, означает, что если принять третью сделку, принятый идентификатор пользователя обновлялся в третьей сделке, и 1-я и 2-я сделка были удалены). пожалуйста, помогите мне сохранить только обновленный массив сделокMongoose поддокумент массив толкая

var incomingUser = req.user;//accepting user accesstoken in header(person1) 
if(req.params.id){ 
var id = req.params.id;//deal id 
console.log("DealId:"+id + "Acceptinguser:"+incomingUser.name); 
User.findOne(
{ 
    "deals": { 
     $elemMatch: { 
     _id: id 
     } 
    } 
    }, 
function(err, data){ 
    console.log("Dealer:" +data.name); 
    console.log("deal:"+ data.deals); 
    if(err){ 
    console.log("User not found"); 
    res.send(new restify.ResourceNotFoundError('failed','Deal not found')); 
    return next(); 
    } 
    var dealObj = _.filter(data.deals, { id: id })[0]; 
    console.log("Deal Obj" + dealObj); 
    var acceptingUser = incomingUser; 
    console.log("accepting user:" +acceptingUser._id); 
    dealObj.accepted = acceptingUser._id; 
    console.log("accept id: "+ dealObj.accepted); 
    data.deals = dealObj; 
    console.log("data:"+ data.deals); 
    data.save(function (err, result){ 
    console.log("Result:" + result); 
    if(err){ 
     console.log("Internal error"); 
     res.send(new restifyc.InternalError('failed','Error accepting')); 
     return next(); 
    } 
    console.log("saved"); 
    res.send(200,{user: result}); 
    return next(); 
    }); 
}); 
} 
} 

И моя схема является

var dealSchema = new mongoose.Schema({ 
shopName: {type: String,required: true}, 
deal: {type: String,required: true}, 
price:{type: Number,required: true}, 
start:{type: Date,default: Date.now}, 
end:{type: Date}, 
expiry:{type: Date}, 
comments:{type: String}, 
accepted: {type:mongoose.Schema.Types.ObjectId, ref:'user'},//person1 _id 
rejected: {type:mongoose.Schema.Types.ObjectId, ref: 'user'} 
}); 
var userSchema = new mongoose.Schema({ 
    name: { type: String,required: true}, 
    phone: { type: Number, required: true,unique: true}, 
    email:{type: String}, 
    password: {type: String}, 
    deals:[dealSchema] 
    }, {collection: 'user'}); 
    mongoose.model('Deal', dealSchema); 
    mongoose.model('user', userSchema); 

ответ

0

Да для того, чтобы конкретно обновлять то, что вам нужно вы можете использовать <array>.$ для указанной позиции элемента:

User.update(
    "deals": { 
    $elemMatch: { 
     _id: id 
    } 
    }, { 
    "$set": { 
     "deals.$" : {/*your deal data*/} 
    } 
    }, function(err, doc) { 

    }); 

Более подробную информацию о том, как использовать $ подстановочные https://docs.mongodb.org/manual/reference/operator/update/positional/

+0

Если мы используем User.update, то как мы можем найти пользователя. Мы находим пользователя, использующего этот идентификатор сделки. –

+0

Спасибо @alex, он работает. –

Смежные вопросы