MongoDB / mongoose嵌入式模式与对象ID效率,当并不总是需要嵌入/引用模式中的数据时

时间:2016-07-18 19:00:33

标签: node.js mongodb mongoose

我在概念上理解了使用MongoDB的最佳方法时遇到的一些问题。

BA中的嵌入式架构,如下所示。

var B = new Schema({});

var A = new Schema({
  aProp1 = {},
  aProp2 = {},
  bList = [B]
});

有两种情况。我要么需要阅读aProp1aProp2,要么添加新的B模型,并根据aProp1模型更新aProp2B

每次需要阅读bList时检索A似乎都不正确。这会在每个查询上获得大量额外数据。

然而,替代方案是将B的mongoose模式ObjectId存储在A的列表中。这似乎是基于我所读到的反模式。要在添加新A时更新B,我现在需要两个单独的查询。如果A在创建新的B后失败,那么我将不得不还原B,这听起来像是回滚/交易的噩梦。

当不总是需要数据时,在MongoDB中引用另一个模式的最佳方法是什么?

1 个答案:

答案 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);
 }