使用Mongoose在MongoDB中创建关系(在Node.js中)

时间:2013-08-24 17:05:29

标签: node.js mongodb mongoose

我试图在Stackoverflow上找到任何类似的问题而没有任何运气。我正在努力寻找在两个文档之间建立关系的正确方法。这是一个非常简单的分层类别案例。每个类别可以有一个父母和多个孩子。

var categorySchema = Schema({
    name: String,
    parent: { type: Schema.ObjectId, ref: 'Category' },
    children: [{ type: Schema.ObjectId, ref: 'Category' }],
    order: Number
});

var Category = mongoose.model('Category', categorySchema);

当我创建一个新的类别时,我得到它应该拥有的(如果有的话)父类的_id。我从POST / PUT请求获取此_id作为字符串,并使用此_id获取类别。获取工作正常,我得到正确的类别作为结果。但这是我挣扎的地方,我如何使用mongoose查询返回的结果来创建新类别及其父类之间的关系?

var query = Category.find({'_id': parentCategoryID});
query.select('name');
query.exec(function (err, parentCategory) {
    if (!err) {
        console.log("Fetched parentCategory: "+parentCategory+".. parentCategory._id: "+parentCategory._id);
        var parent = parentCategory.toObject();
        var category = new Category();
        category.name = name;
        category.parent = Schema.ObjectId(parent._id);

的console.log 获取的parentCategory:{name:'Parent Category',_ id: 5218dcd6e6887dae40000002} .. parentCategory._id:undefined

我尝试过多种不同的方式设置父属性,但我无法让它工作。还没有找到关于这个问题的文件。

非常感谢有关此事的任何帮助,我希望更多的人可以从这个问题的任何答案中受益。

1 个答案:

答案 0 :(得分:1)

//problem 1: `find` returns a list of results. You just need findById
var query = Category.findById(parentCategoryID);
query.select('name');
query.exec(function (err, parentCategory) {
  //Problem 2: don't ignore errors. Handle them first and short-circuit return
    if (err) {
      console.err(err);
      return;
    }
    console.log("Fetched parentCategory: "+parentCategory+".. parentCategory._id: "+parentCategory._id);
    //problem 3: mongoose will do the right thing with your schema here
    //all you need is
    var category = new Category();
    category.name = name;
    category.parent = parentCategory;
    //and don't forget
    category.save(...callback....);
}

另请注意,如果您有一个架构,并且您指定了一些与架构不匹配的东西,那么mongoose将丢弃数据,这可能就是您发生的事情,假设您在某个时刻调用了category.save()