Node.js Mongoose:设置双向引用
我正在开发一个Express+Mongoose web应用程序,它有许多相互依赖的模型。除非我可能没有正确设计数据,否则我希望找出在相互关联的两个对象之间设置引用的最佳方法 我知道在我的Schema obj中,如果我希望一个Schema引用另一个Schema,我会添加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
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?
});
});