带有$或的mongoose中的复杂多个查询

Lau*_*yts 2 javascript mongoose mongodb node.js mongodb-query

我正试图找到一种方法来使自己成为可能的代码,以便使用多个复杂的查询.

我在MongoDB中有2个文档.第一个是追随者,第二个是事件.

第一个查询:获取特定用户的所有关注者.第二个查询:获取所有关注者的所有事件,并按日期对其进行排序.

我不知道如何进行第二次查询.

也许是这样的:

Event.find({ "$or" : [
                        {
                            'userId': followers[0].id,
                        },
                        {
                            'userId': followers[1].id,
                        },
                        {
                            'userId': followers[2].id,
                        },
                        ]});
Run Code Online (Sandbox Code Playgroud)

但这对我来说并不是一个非常干净的代码.

chr*_*dam 5

我认为你需要的是$in操作员.的$in操作者只需要一个指数而$or操作者需要更多的(每个子句之一).该文件还明确指出:

当使用$或对同一字段的值进行等式检查时,请使用$ in运算符而不是$或运算符.

您可以按如下方式修改查询:

var userIds = [followers[0].id, followers[1].id, followers[2].id]; 
Event.find({ 'userId': { $in: userIds } }, function(err, result){ ... });
Run Code Online (Sandbox Code Playgroud)

或者正如Neil Lunn所建议的那样,另一种解决方法是使用本机映射方法生成所需用户ID的数组:

Event.find({
     "userId": {
          "$in": followers.map(function (follower){
               return follower.id
           }))
     }
}, function(err, result){ ... });
Run Code Online (Sandbox Code Playgroud)

  • 实际上并非如此,因为优化器会"使用"多个索引,因此可以清楚地知道可以使用单个索引,因为它只涉及同一个字段.关键是当在同一个字段上使用简单值或正则表达式时,`$或`和`$ in`实际上是相同的形式.所以`$ in`是`$或',因为'$ all`是'$和`. (2认同)