我在概念上理解了使用MongoDB的最佳方法时遇到的一些问题。
B
是A
中的嵌入式架构,如下所示。
var B = new Schema({});
var A = new Schema({
aProp1 = {},
aProp2 = {},
bList = [B]
});
有两种情况。我要么需要阅读aProp1
和aProp2
,要么添加新的B模型,并根据aProp1
模型更新aProp2
和B
。
每次需要阅读bList
时检索A
似乎都不正确。这会在每个查询上获得大量额外数据。
然而,替代方案是将B
的mongoose模式ObjectId存储在A
的列表中。这似乎是基于我所读到的反模式。要在添加新A
时更新B
,我现在需要两个单独的查询。如果A
在创建新的B
后失败,那么我将不得不还原B
,这听起来像是回滚/交易的噩梦。
当不总是需要数据时,在MongoDB中引用另一个模式的最佳方法是什么?
答案 0 :(得分:0)
如果您的bList
是对B
的引用数组,那么您可以查询数据库,而无需每次都加载B
模式中的所有内容。您仍然可以获取B
中每个bList
的信息,但是如果您愿意,可以使用填充。
您的A
架构将如下所示:
var A = new Schema({
aProp1 = {},
aProp2 = {},
bList = [{type: Schema.Types.ObjectId, ref: 'B'}]
});
然后,只要您想查询A
并在每个B
中包含每个A
的所有信息,就可以使用.populate()
。
A
.find({})
.populate('bList')
.exec((err, As) => {
if (err) console.log(err);
else console.log(As);
}