database - MongoDB:索引属性上的 $lookup 与非索引属性上的 $in
问题描述
我目前正在使用 MongoDB 3.5,我有两个集合(用户、项目)。每个用户都有一个项目列表
//users
{
_id: ObjectId('userObjId1')
itemArray: [
{ ObjectId('itemA'), specialId: '123-this-is-unique'},
{ ObjectId('itemB'), specialId: '456-this-is-unique'},
{ ObjectId('itemC'),specialId: '789-this-is-unique'},
]
}
和物品
//items
{
_id: ObjectId('itemA')
specialId: '123this-is-unique'
owner: ObjectId('userObjId1')
}
我的一项操作涉及查询用户,给定一个数组specialIds
在我的项目集合中,项目specialId
被编入索引。
哪一个会是更好的做法(并且可能会有更好的表现)?
specialIds
A)使用运算符查询用户集合中的数组$in
。优点:查询保持在同一个集合中缺点:itemArray
每个用户中的自身没有被索引,据我了解这可能会影响性能
B)在 items 集合中查询,projectowner
并使用它$lookup
在 users 集合中运行优点:较新的 sytanx,因为specialIds
已经在 items 集合中建立索引,它应该是更好的性能。缺点:需要在一个查询中访问两个集合
解决方案
这取决于您拥有多少用户,以及每个用户拥有多少项目。
如果您的用户数量很少(几十个甚至几百个),或者您可以在{"itemArray.specialId":1}
计划 B 将使用索引specialId
来选择项目,然后_id
在查找期间使用用户集合中的索引,这应该会执行得相当好。