我正在学习node.js和mongodb。在许多教程的推荐下,我正在使用 mongoose 来帮助与 mongo 交互。更复杂的是,我有一个重要的 RDMS 背景,并且正在尽我最大的努力来对抗我通过 SQL 镜头看到 mongodb 的愿望。
现在我正在努力解决查询子文档的概念。我已经弄清楚如何根据子文档的属性查询父文档,但无法弄清楚如何通过直接查询子文档来查询所有父文档(无论类型如何)。为了说明,我有以下人为的示例模式:
// subdocument
var CategorySchema = new Schema({
name: { type: String, required: true }
});
var IpSchema = new Schema({
ip_address: { type: String, required: true, index: true }
,categories: [CategorySchema]
});
var DomainSchema = new Schema({
domain_name: { type: String, required: true, index: true }
,categories: [CategorySchema]
});
var ip = mongoose.model('Ip', IpSchema);
var domain = mongoose.model('Domain', DomainSchema);
var category = mongoose.model('Category', CategorySchema);
上述模式在每个存储的域和 ip 文档中嵌入了类别的子文档数组。使根据类别名称分别检索域和 ip 变得容易,但难以一次性检索与特定类别关联的所有域和 ip。下面的代码概述了为什么我相信这一点:
category.find(function (err, tcs) {
console.log(tcs); // contains an empty set because no categories stored here
});
ip.find({ 'categories.name' : req.params.category }, function(err, ips) {
console.log(ips); // contains all parent documents w/ subdocument name
});
domain.find({ 'categories.name' : req.params.category }, function(err, ips) {
console.log(ips); // contains all parent documents w/ subdocument name
});
现在我可以结合上述查询的结果,但这似乎很脆弱——假设我在越来越多的文档上重用类别。这是否让我存储类别,然后通过类别 ID 嵌入参考?为了优化读取而编写时,这似乎会增加流失率。不幸的是,我的 Googlefu 未能找到标记方案的任何教程/最佳实践。也可能是我把事情复杂化了。
基于共享子文档检索不同父文档的最佳方法是什么?