0

我想要做的应该是直截了当的,但由于某种原因,我很难弄清楚这一点。我有以下 Mongoose 模式(简化)。

var Status = new Schema({
    name : { type: String, required: true },
    description : { type: String }
});

var Category = new Schema({
    statuses : [Status], // contains a list of all available statuses
    // some other attributes
});

var Book = new Schema({
    statuses : [Status], // preferably this would not be an array but a single document, but Mongoose doesn't seem to support that
    // some other attributes
});

现在,我想做以下事情:

  1. 检索类别文档
  2. 查找特定的嵌入状态文档(基于请求参数)
  3. 将特定的嵌入状态文档分配给特定的 Book 文档。我想替换现有的图书状态,因为在任何给定时间,应该只为一本书设置一个状态。

这是我目前正在做的事情:

mongoose.model('Category').findOne({_id: id}, function(err, category){
    if(err) next(err);
    var status = category.statuses.id(statusId); // statusId available via closure
    book.statuses[0] = status; // book available via closure; trying to replace the existing status here.
    book.save(function(err){
        if(err) next(err);
        next();
    });
});

以上似乎运行良好,我没有收到任何错误。但是,新状态不会保存到文档中。下次我输出更​​新后的 Book 文档时,它仍然是旧状态。我对此进行了调试, find() 方法以及设置状态似乎都很好。

我现在唯一能想到的是,不知何故,我分配的状态值不是用 Mongoose 保存的正确格式。虽然,我希望那时会出现某种错误消息。

或者也许有更好的方法来做这一切?

4

1 回答 1

0

这可能是因为您正在尝试复制嵌入的文档,该文档本身可能具有与之关联的 ObjectId。尝试将副本保存Status在 中Book会创建两个具有相同ObjectId. 尝试创建一个新的 Status 对象并复制字段。

很难在ObjectsIds 上找到嵌入文档的文档,但这里提到了它们:http: //mongoosejs.com/docs/embedded-documents.html

于 2011-07-06T18:03:32.400 回答