gpt4 book ai didi

node.js - Mongoose:设置双向引用

转载 作者:可可西里 更新时间:2023-11-01 09:57:53 27 4
gpt4 key购买 nike

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

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

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

现在,我正在做下面的事情,但是代码看起来很乱:

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...
}
});
})
});
})

在这种情况下,我有意避免嵌入,因为在我的应用程序中,我假设我需要单独查询这些对象,而不必从其中任何一个加载数据。

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

最佳答案

使用 MongooseJS,您可以在本地创建它们,关联它们,然后使用 promise 将它们并行保存到数据库(这使用 native Promise 对象,但库可以工作):

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

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

Promise.all([
objectA.save(),
objectB.save()
]).then(function(savedObjects) {
// Do something to celebrate?
}).catch(function(err) {
// one or both errored
});

更新:如果需要,您还可以使用嵌套保存。关键是 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?
});
});

关于node.js - Mongoose:设置双向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31437514/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com