首页 > 解决方案 > 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被编入索引。

哪一个会是更好的做法(并且可能会有更好的表现)?

specialIdsA)使用运算符查询用户集合中的数组$in。优点:查询保持在同一个集合中缺点:itemArray每个用户中的自身没有被索引,据我了解这可能会影响性能

B)在 items 集合中查询,projectowner并使用它$lookup在 users 集合中运行优点:较新的 sytanx,因为specialIds已经在 items 集合中建立索引,它应该是更好的性能。缺点:需要在一个查询中访问两个集合

标签: databasemongodbperformanceaggregation-framework

解决方案


这取决于您拥有多少用户,以及每个用户拥有多少项目。

如果您的用户数量很少(几十个甚至几百个),或者您可以在{"itemArray.specialId":1}

计划 B 将使用索引specialId来选择项目,然后_id在查找期间使用用户集合中的索引,这应该会执行得相当好。


推荐阅读