如何使用Mongoose将嵌入式文档从一个文档放入另一个文档?

时间:2011-05-25 13:29:40

标签: mongodb mongoose express

我想做的事情应该是直截了当的,但由于某种原因,我在解决这个问题时遇到了真正的困难。我有以下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状态,因为在任何给定时间,只应为一本书设置一个状态。
  4. 以下是我目前正在做的事情:

    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保存。虽然,我会期待某种错误信息。

    或许还有更好的方法可以做到这一切吗?

1 个答案:

答案 0 :(得分:0)

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

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