Mongodb 解析服务器源_rperm和_wpermmongo查询,我应该为它们编制索引吗?

Mongodb 解析服务器源_rperm和_wpermmongo查询,我应该为它们编制索引吗?,mongodb,parse-server,Mongodb,Parse Server,我正在浏览我的mongo日志,为我的未索引查询添加索引。默认情况下,mongo只记录需要超过100毫秒才能完成的查询 我发现我有好几把on和rperm钥匙。我知道ACL就是这样被分解的。但是什么类型的Parse.Query调用可以在日志中创建这样的查询呢 query:{orderby:{},$query:{u rperm:{$in:[null,“*”,“[UserId]”]]}} 我甚至注意到,这个查询是在一个总共只有8个对象的类上进行的,但是需要133ms才能完成,对于这样一个小的类来说,这似

我正在浏览我的mongo日志,为我的未索引查询添加索引。默认情况下,mongo只记录需要超过100毫秒才能完成的查询

我发现我有好几把on和rperm钥匙。我知道ACL就是这样被分解的。但是什么类型的Parse.Query调用可以在日志中创建这样的查询呢

query:{orderby:{},$query:{u rperm:{$in:[null,“*”,“[UserId]”]]}}

我甚至注意到,这个查询是在一个总共只有8个对象的类上进行的,但是需要133ms才能完成,对于这样一个小的类来说,这似乎非常慢,即使它必须在内存中进行排序和扫描

我是否应该在代码级别解决这个问题,修改查询以避免这种类型的mongo查询?还是应该为这些类型的查询添加索引

我注意到在mLab的Slow Queries选项卡中也显示了一些。查询看起来像
{“\u id”:““\u wperm”:{“$in”:[”“]}}
,带有建议的索引
{“\u id”:1,“\u wperm”:1}
,但它有以下注释:

“_id”位于现有的{“_id”:1}唯一索引中。以下索引建议仅在某些情况下才有必要

然而,这是我较慢的查询之一,需要320毫秒才能完成。它在用户类上。这仅仅是因为_User类有很多行吗?由于_id是唯一的,我觉得添加一个_wperm索引不会有什么区别,因为我最终只有一个对象


我很好奇,对这些查询采取行动是否会带来好处,或者我是否应该安全地忽略它们。

您应该按照mongodb的建议为您的收藏编制索引。在parse.com时代,这些索引是根据看到的工作负载自动创建的。现在您需要创建它们。两者都有道理。在没有主键的情况下运行的每个查询都会命中_rperm。每一次书写中的_wperm。将来,我们可以自动创建_id+_wperm索引,因为所有写入操作都使用该索引

,这说明了导致查询的原因。但是,
{“\u id”:1,“\u wperm”:1}
的索引如何提供额外的好处,特别是当它已经是一个带有\u id字段的查询时?这总是很慢,还是只有当我们有大量角色和个人用户的复杂ACL设置时?所以,
{“\u id”:1,“\u wperm”:1}
也可以在每个类上设置,但我只需要担心在mLab慢速查询选项卡中显示的查询上有一个“\u rperm”索引,对吧?明白了!两个_id/_wperm上的索引仍将提供额外的好处,因为您将节省写入数据的CPU周期,因为它不需要从数据库中读取以确保_wperm与更新的内容匹配。同样在_rperm上,检查您的慢速查询并从那里进行优化。啊,我明白了。对不起,我最近才真正开始戴上我的DB管理员帽子,我想确保我得到了这个。因此,索引尽可能保存在内存中。写操作并不严格要求将数据从存储器中取出,只要求将数据放入存储器。但是,由于我们有权限,我们需要知道我们传递了这些权限。如果没有_wperm索引,我们需要从存储器中加载对象,以检查我们是否通过了权限检查,而索引将使我们能够立即知道我们是否能够根据内存中的信息更新数据,而不必加载任何内容。事实上,Mongo本身没有强制执行这些权限吗?这实际上是Parse Server的一个功能?因此,如果我们不执行主密钥保存,它首先需要检查权限,如果创建了_id,_wperm索引,权限仍然可以利用内存中的索引。我想这也解释了为什么我们没有办法通过Parse.Query构建我们自己的mongo查询,因为我们可以自己添加'*'\u rperm/\u wperm。你是100%正确的。另外,在_id/_wperm上添加索引应该是服务器自己做的事情,因为用户完成的所有写入操作都将使用此索引。与其拥有数百万个对象,不如早点拥有它。