Mongoose Subdocument数组推送

时间:2016-04-20 07:09:08

标签: node.js mongodb mongoose

我的方案是person1接受person2交易意味着person1_id将保存在person2特定deal字段accepted内,如果被接受的用户(person2)有一笔交易,我已经尝试了它完美运作的代码但是如果有多笔交易它正在更新但是删除其他交易(即假设person2有3笔交易意味着person1接受第三笔交易,接受的用户ID在第三笔交易中更新,第一笔和第二笔交易被删除了。。任何人请帮我如何只保存更新的交易数组

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);

1 个答案:

答案 0 :(得分: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/

的更多详细信息