【问题标题】:MongoDB: $lookup on an indexed property vs $in on a non-indexed propertyMongoDB:索引属性上的 $lookup 与非索引属性上的 $in
【发布时间】:2020-06-09 21:11:04
【问题描述】:

我目前使用的是 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 数组

在我的项目集合中,项目的specialIds 已编入索引。

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

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

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

【问题讨论】:

    标签: database mongodb performance aggregation-framework


    【解决方案1】:

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

    如果您的用户数量很少(几十个甚至几百个),或者如果您可以在 {"itemArray.specialId":1} 上创建索引,则计划 A 会很有效

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

    【讨论】:

    • 感谢您的回答!我实际上会有很多用户,但 itemsArray 的数量可能会更少。在那种情况下,我想我应该选择 B 计划。
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 2013-06-16
    • 2017-02-07
    • 2020-10-09
    • 1970-01-01
    • 2022-10-24
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多