我会避免使用多个集合来建模这种情况,因为 MongoDB 不支持连接,并且正如您所说,您希望将级别 1 和级别 2 之间的引用联系在一起。听起来代表一个图像的文档会相当小,而且很简单 - 如果图像可能具有多种颜色,则可能不适合在一个文档中对图像进行建模。所以我会去收集一个集合,每个文档建模一个图像。
听起来您的图像有两个属性,颜色和图案。
如果每个图像只有 1 种颜色和 1 种图案,那么一个简单的模式是:
{
_id: ObjectId('...'),
name: "image1",
color: "green",
pattern: "solid"
}
允许每个图像具有多种颜色和图案的架构是:
{
_id: ObjectId('...'),
name: "image1",
color: ["green", "red"],
pattern: ["plaid", "solid"]
}
您可以使用如下查询查询上述任一模式:
db.images.find({ pattern:"solid", color: "green" });
使用 Mongoose(用于 Node 的 MongoDB 对象建模库),第一个模式将如下所示。请注意在应用程序代码中使用enum 将这些字段限制为有效值。
var imageSchema = new mongoose.Schema({
color: { type: String, enum: ['grey', 'blue', 'green', 'red'] },
pattern: { type: String, enum: ['solid', 'stripe', 'plaid'] },
name: String,
});
var Image = mongoose.model('image', imageSchema, 'images');
Image.find({ pattern:"solid", color: "green" }).exec(callback);