0

我的快递应用程序中有一个带有“checked_in”标志的基本文档:

module.exports = Book= mongoose.model('Book', new Schema({
 name : String,
 checked_in : Boolean
},{ collection : 'Book' }));

我想记录书籍何时签入和签出,所以我想出了另一个模式:

var action = new Schema({
 checked_in: Boolean,     
});

module.exports = Activity = mongoose.model('Activity', new Schema({
 book_id: String,
 actions: [action]
},{ collection : 'Activity' }));

'book_id' 应该是一本书的文档 ID,当我更新一本书时,我需要使用操作中的新项目创建或更新该书的活动日志:

exports.update = function(req, res){  
    return Book.findById(req.params.id, function(err, book) {  
       var activity = new Activity({book_id: book.id});
       activity.actions.push({
           checked_in: req.body.checked_in,
       });

       Activity.update({ book_id: book.id}, activity.toObject(), { upsert: true }));

       book.checked_in = req.body.checked_in;
       return device.save(function(err) {
           return res.send(book);
       });
    });
};

我遇到的问题是没有任何东西被插入到 Activity 集合中。如果我使用 .save() 那么我只会在集合中得到很多重复项。

更新

我已经开始按照下面给出的建议重新工作,但仍然没有任何运气。这是我现在拥有的:

module.exports = Activity = mongoose.model('Activity', new Schema({
  book_id: Schema.ObjectId,
  actions: [new Schema({
    checked_in: Boolean,
    last_user: String
  })]
},{ collection : 'Activity' }));

这是现在的更新代码:

exports.update = function(req, res){  
  // TODO: Check for undefined.
  return book.findById(req.params.id, function(err, book) {    
    if(!err) {
      // Update the book.
      book.checked_in = req.body.checked_in;
      book.last_user = req.body.last_user;    
      book.save();

      // If there's no associated activity for the book, create one. 
      // Otherwise update and push new activity to the actions array.
      Activity.findById(book._id, function (err, activity) {
        activity.actions.push({
          checked_in: req.body.checked_in,
          last_user: req.body.last_user
        })

        activity.save();      
      });
    }
  });
};

我想要结束的是每本书的文档,其中包含一系列签出/签入,每次有人签入或签出一本书时都会更新。IE:

{
    book_id: "5058c5ddeeb0a3aa253cf9d4",
    actions: [
        { checked_in: true, last_user: 'ralph' },
        { checked_in: true, last_user: 'gonzo' },
        { checked_in: true, last_user: 'animal' }
    ]
}

最终,我将在每个条目中都有一个时间戳。

4

2 回答 2

2

我看到了一些可以改进的地方......

  • 模型中的book_id字段Activity应该Schema.ObjectId代替String. 然后,您可以根据需要使用填充。

  • 你没有做任何错误检查exports.update。如果用户传入一个 invalid id,您将需要检查是否book未定义,以及 common if (err) return next(err)(这要求您的函数参数是res, res, next)。

  • 当您在 中创建活动时exports.update,您希望使用book._id而不是book.id

  • return不需要所有的语句

  • device变量未在任何地方声明,我不确定您要保存什么...我认为您的意思是book那里。

然后,您可以只.save()进行活动而不是进行Activity.update.

于 2012-10-01T02:34:32.193 回答
2

有几个问题:

  1. 您正在尝试findById使用图书的 id 而不是活动的 id 来查找图书的活动文档。
  2. 您没有处理图书的活动文档尚不存在的情况。

试试这个:

Activity.findOne({book_id: book._id}, function (err, activity) {
  if (!activity) {
    // No Activity doc for the book yet, create one.
    activity = new Activity({book_id: book._id});
  }
  activity.actions.push({
    checked_in: req.body.checked_in,
    last_user: req.body.last_user
  });

  activity.save();
});
于 2012-10-06T14:44:30.670 回答