我在MongoDB中有3个集合,它们的架构无法更改。有些查询需要访问3个集合。
我知道我需要多个查询来执行此操作,但我不确定执行此操作的最有效方法是什么。以下示例已简化:
我的数据包含一个“用户”集合,作为其他两个集合的逻辑父集合。另外两个系列是“DVD”和“CD”。用户可以拥有多张CD或DVD
User Document
id : "jim",
location : "sweden"
CD Document
name : "White Album",
owner : "jim"
DVD Document
name : "Fargo",
owner : "jim"
现在,我正在采取的方法如下。如果我想为瑞典的用户取回所有的CD和DVD。
第1步
Get all users in Sweden and return a cursor
第2步
Iterate through the each user in the cursor and perform a lookup on both the DVD and CD collections to see if the users id matches the owner field
第3步
If it does add the user to an array to be returned
这种方法需要2个额外的查询,对我来说效率似乎非常低。有没有更有效的方法呢?
答案 0 :(得分:2)
您可以按如下方式对查询进行一些改进。
db.user.find({位置: “瑞典”},{ID:1})
db.cd.find({owner : {$in : ["jim", "tom", ...]}}) db.dvd.find({owner : {$in : ["jim", "tom", ...]}})
还要在集合上添加索引以提高查询性能。
答案 1 :(得分:0)
它听起来效率不高。
您很可能会考虑使用SQL技术,每次查询时都会生成结果集,然后将结果集缓存在磁盘或内存中。
MongoDB直接从每个游标批处理数据文件流,这意味着它的数据与数据库“实时”不同,不像结果集。这也意味着ping奇怪的查询也是很多资源密集型的。
正如您所说,一个选项是将所有用户和每个迭代判断是否应该显示它们,因为它们具有相关记录。这可以均匀地分布游标停止过载,但是,服务器上仍然存在游标过载的可能性。
另一个选择是迭代来自瑞典的所有用户并获取一个巨大的user_id
数组,用于查询CD和DVD集合。然后,您将在应用程序中将它们匹配并根据需要返回。
但是,具体如何解决这个问题取决于您的方案以及您拥有的数据量。
答案 2 :(得分:0)
如果您无法更改架构,并且 你想知道有多少来自瑞典的用户有CD或DVD,那么我认为这是最小的方法:
然后你只有2个查询,但如果你的DVD和CD集合足够大,这可能不会比你的方法快,即使这个方法只使用2个查询。
请记住,较少的查询数量并不一定意味着更快。
对不起英文;)