【问题标题】:Creating relationships in MongoDB using Mongoose (in Node.js)使用 Mongoose 在 MongoDB 中创建关系(在 Node.js 中)
【发布时间】:2013-08-27 13:53:45
【问题描述】:

我试图在 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 查询返回的结果来创建新 Category 与其 Parent 之间的关系?

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: 未定义

我已尝试以多种不同的方式设置父属性,但无法使其正常工作。也没有任何运气找到有关该问题的文档。

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

【问题讨论】:

  • 这听起来更像是像 Neo4j 这样的图形数据库而不是像 MongoDB 这样的面向文档的数据库。
  • 我真的不明白您如何从我的问题中获得足够的信息来得出这个结论。 Category 部分只是实际数据模型的一小部分。再说一次,我没有对 MongoDB 的优缺点进行过广泛的研究,我选择 MongoDB 是为了学习一些新东西。不过感谢您的意见,以前从未听说过 Neo4j。

标签: node.js mongodb mongoose


【解决方案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()

【讨论】:

  • 我删除了错误处理并保存,以免使我的问题的关键部分变得臃肿。显然这些都是存在的。你是对的,上面的代码有效。我想我在修复我的架构后未能测试这种方式来分配 parentCategory。谢谢!
  • 不要忘记处理 parentCategory 为空。
猜你喜欢
  • 2011-12-10
  • 2016-06-03
  • 2014-11-18
  • 2017-05-14
  • 1970-01-01
  • 2017-04-14
  • 2016-01-21
  • 1970-01-01
  • 2012-12-09
相关资源
最近更新 更多