我正在学习node.js和mongodb的过程。在许多教程的推荐下,我正在利用猫鼬帮助与mongo进行交互。使事情复杂化,我有一个重要的RDMS背景,并且正在尽我所能来打破我的想法,希望通过SQL透镜来查看mongodb。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文档中类别的子文档阵列。通过一个类别名称轻松检索域名和ips 单独,但很难在单个镜头中检索与特定类别关联的所有域和ips。下面的代码概述为什么我相信这一点:
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
});
现在我可以结合上面的查询的结果,但似乎可能brittle--假设我在重用现在越来越多的文件类型。这是否让我存储类别,然后通过类别ID嵌入参考?这似乎是为了优化读取而写入时会增加流失。不幸的是,我的Googlefu让我无法找到任何关于标记方案的教程/最佳实践。也可能是我过于复杂的事情。
什么是检索基于共享子文档不同的父文档的最佳方法是什么?
选项3似乎是最合乎逻辑的。显然,mongo允许这种使用模式,但是我是否违反了使用它的原则? – ahsteele
不是。关系数据库和文档数据库都不适合每种用例。我认为整个社区正在认识到,大型复杂的现代应用程序需要由多个不同的数据库引擎支持,每个数据库引擎都处理它擅长的用例。这对于面向文档或关系数据库来说都不是理想的用例,但它在每一种情况下都可行。在那里可能有一个不同的NoSQL数据库比MongoDB更有效地处理这个数据库。不确定。 –
对不起,将其标记为答案。 – ahsteele