$ match mongodb聚合框架_ mongoose

时间:2018-11-18 08:32:56

标签: node.js mongodb mongoose aggregation-framework

我的控制器中有多个查询条件,如果存在则需要路径。

条件1:

{ tags: mongoose.Types.ObjectId(req.params.tagId)}

条件2:

{ reportedBy: { '$ne': req.user._id }} // if this video object reported dont show

条件3:

{ owner: { '$ne': userblocks } } // userblocks is a array of objectIds

这是我的$ match过滤器:

{
 '$match':
   _.isString(req.params.tagId) ?
   { tags: mongoose.Types.ObjectId(req.params.tagId), 
   reportedBy:{ '$ne': req.user._id}, owner: { '$ne': userblocks}}:
   { reportedBy:{ '$ne': req.user._id},owner: {'$ne': userblocks}}
},

如果 tagId 传递给params,则使用 ... 传播运算符。此条件适用于tagId,但其他条件不起作用。

使用@Anthony Winzlet提示我尝试过:

{reportedBy:{ '$ne': mongoose.Types.ObjectId(req.user._id)},owner: {'$ne': userblocks}} 

userblocks 是对象列表,我检查了它们的类型,它们也是对象。因此无需将其强制转换为objectIds。

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

let $match = {
   reportedBy: { '$ne': mongoose.Types.ObjectId(req.user._id) },
   owner: { '$nin': userblocks } // $nin when comparing against array of object ids
},

if(_.isString(req.params.tagId)) {
   $match.tags = mongoose.Types.ObjectId(req.params.tagId)
}

然后只需在您的$match中使用aggregation pipeline或将其用作管道的其他任何部分。

注意事项:

  • _id mongoose.Types.ObjectId比较时,应使用功能。
  • 与数组$in$nin进行比较时,通常是您要使用的。
  • 在您的_.isSting检查逻辑中,您似乎在两种情况下都拥有reportedByowner,因此在我看来,某些重构不会受到损害。