MongoDB模式嵌入和嵌套的唯一键

时间:2013-10-16 16:04:29

标签: mongodb mongoose schema-design

我有一个关系SQL DB,它被改为MongoDB。在SQL中有3个相关的表:Farm,Division,Wombat(此问题的名称和用途已更改)。还有一个Farmer表,它相当于一个用户表。

使用Mongoose我已经提出了这个新架构:

var mongoose = require('mongoose');
var farmSchema = new mongoose.Schema({
    // reference to the farmer collection's _id key
    farmerId: mongoose.Schema.ObjectId, 
    name: String, // name of farm
    division: [{
        divisionId: mongoose.Schema.ObjectId,
        name: String,
        wombats: [{
            wombatId: mongoose.Schema.ObjectId,
            name: String,
            weight: Number
        }]
    }]
});

每个(现在)嵌套的集合中都有一个唯一的字段。这将允许我使用Ajax仅发送uniqueId和权重(例如)来调整该值,而不是仅在权重发生变化时更新整个文档。

这感觉就像MongoDB的SQL改编不正确。有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

总的来说,我认为人们在使用MongoDB时往往会过多地嵌入。

最重要的论点是,对同一个对象使用不同的编写器会使事情变得复杂得多。使用数组和嵌入对象可能很棘手,有些修改是不可能的,例如因为没有positional operator matching in nested arrays

对于您的特定情况,请注意唯一的数组键might not behave as expected,并且该行为可能为change in future releases

通常需要选择简单的类似SQL的架构,例如

Farm { 
  _id : ObjectId("...")
}

Division {
  _id : ObjectId("..."),
  FarmId : ObjectId("..."),
  ...
}

Wombat {
  _id : ObjectId("..."),
  DivisionId : ObjectId("..."),
  ...
}

嵌入是否是正确的方法取决于使用模式,数据大小,并发写入等等 - SQL的一个关键区别是there is no one right way to model 1:n or n:n relationships,因此您必须仔细权衡专业人员每种情况的利弊。根据我的经验,拥有唯一的ID是一个非常有力的指标,表明该文档应该是“一等公民”并拥有自己的集合。