Node.js Mongoose:设置双向引用

Node.js Mongoose:设置双向引用,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在开发一个Express+Mongoose web应用程序,它有许多相互依赖的模型。除非我可能没有正确设计数据,否则我希望找出在相互关联的两个对象之间设置引用的最佳方法 我知道在我的Schema obj中,如果我希望一个Schema引用另一个Schema,我会添加referenceId:{type:Schema.Types.ObjectId,ref:'ModelName'},作为属性。到目前为止,在创建模型时,我一直在将此属性设置为要引用的id。例如:obj.referenceId=some

我正在开发一个Express+Mongoose web应用程序,它有许多相互依赖的模型。除非我可能没有正确设计数据,否则我希望找出在相互关联的两个对象之间设置引用的最佳方法

我知道在我的Schema obj中,如果我希望一个Schema引用另一个Schema,我会添加
referenceId:{type:Schema.Types.ObjectId,ref:'ModelName'},
作为属性。到目前为止,在创建模型时,我一直在将此属性设置为要引用的
id
。例如:
obj.referenceId=someReferenceId;对象保存(…)

但是,如果我有两个独立的模式,但它们各自都有一个相互引用,该怎么办?设置这些的最佳方式是什么

现在,我正在执行以下操作,但代码看起来非常混乱:

objectASchema = Schema({
    objectBReference: { type: Schema.Types.ObjectId, ref: 'ObjectB' },
})
mongoose.model('ObjectA', objectASchema);

objectBSchema = Schema({
    objectAReference: { type: Schema.Types.ObjectId, ref: 'ObjectA' },
})
mongoose.model('ObjectB', objectBSchema);

// in a route/controller, and assuming we have an Object B created
// but you can see that if I don't have that, it gets messier
ObjectA.create(..., function(err, objectA) {
    objectA.objectBReference = objectBReferenceId;
    objectA.save(function(err) {
        ...
        ObjectB.findById({_id: objectBReferenceId}, function(err, objectB) {
            objectB.objectAReference = objectA._id;
            objectB.save(function(err) {
                if (!err) {
                    // success! we're done here...
                }
            });
        })
    });
})
我有意避免在这种情况下嵌入,因为在我的应用程序中,我是在假设我需要单独查询这些对象的情况下运行的,而不必从其中任何一个加载数据


我的用例类似于拥有
产品
审查
用户
模型,其中每一个都引用了另一个,但不一定嵌入到另一个中。查询可以是这样的:获取此产品的所有评论,或者获取此用户的所有评论。这意味着评论不能嵌入到用户或产品中

使用MongooseJS,您可以在本地创建它们,将它们关联起来,然后使用promise将它们并行地保存到DB中(这使用本机对象,但可以使用库):

更新:如果需要,还可以使用嵌套保存。关键的一点是,ID是在本地生成的,可以与其他文档关联,而无需先保存它们

var objectA = new ObjectA();
var objectB = new ObjectB();

objectA.objectBReference = objectB;
objectB.objectAReference = objectA;

objectA.save(function (err, objA) {
  if (err) { ... }

  objectB.save(function (err, objB) {
    if (err) { ... }

    // Do something to celebrate?
  });
});

承诺是我克服嵌套回调保存的唯一方法,还是在Mongo中有更合适的方法来做到这一点?@tsurantino如果您愿意,您仍然可以使用嵌套保存。我使用了一个承诺来说明保存它们是相互独立的(即,关联它们的ID是本地生成的)。更新显示嵌套保存。酷!谢谢你更多地解释你的答案。最后,我也在探索承诺。亲爱的,我希望你能通过承诺来实现这一点。谢谢
var objectA = new ObjectA();
var objectB = new ObjectB();

objectA.objectBReference = objectB;
objectB.objectAReference = objectA;

objectA.save(function (err, objA) {
  if (err) { ... }

  objectB.save(function (err, objB) {
    if (err) { ... }

    // Do something to celebrate?
  });
});