【问题标题】:multi condition in $match mongodb aggregate framework _ mongoose [duplicate]$match mongodb聚合框架_mongoose中的多条件[重复]
【发布时间】:2019-04-20 21:31:39
【问题描述】:

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

条件一:

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

条件二:

{ 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。

【问题讨论】:

  • 您需要将您的其他 id 转换为 mongoose objectId。就像您使用 tagId
  • @AnthonyWinzlet 在我的用户块中,所有这些都是对象而不是字符串。让 userblocks = [...req.user.blockedUser, ...req.user.blockedBy].map(blocks=>mongoose.Types.ObjectId(blocks));
  • @AnthonyWinzlet 我尝试这样做:{reportedBy:{ '$ne': mongoose.Types.ObjectId(req.user._id)},owner: {'$ne': userblocks}}

标签: node.js mongodb mongoose aggregation-framework


【解决方案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)
}

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

注意事项:

  • _id比较时,应使用mongoose.Types.ObjectId函数。
  • 与数组比较时,$in$nin 通常是您想要使用的。
  • 在您的_.isSting 检查逻辑中,您似乎在这两种情况下都有reportedByowner,所以在我看来,一些重构不会有坏处。

【讨论】:

  • owner: {'$nin': userblocks} 这工作正常。但这不起作用:reportBy:{ '$ne': mongoose.Types.ObjectId(req.user._id)}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
相关资源
最近更新 更多