$match mongodb聚合框架_mongoose中的多条件[重复]
Posted
技术标签:
【中文标题】$match mongodb聚合框架_mongoose中的多条件[重复]【英文标题】:multi condition in $match mongodb aggregate framework _ mongoose [duplicate] 【发布时间】: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
【参考方案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
检查逻辑中,您似乎在这两种情况下都有reportedBy
和owner
,所以在我看来,一些重构不会有坏处。
【讨论】:
owner: '$nin': userblocks 这工作正常。但这不起作用:reportBy: '$ne': mongoose.Types.ObjectId(req.user._id)以上是关于$match mongodb聚合框架_mongoose中的多条件[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 $project 中提供的 _id 与 mongodb 聚合进行 $match?
MongoDb 聚合 $match 错误:“参数必须是聚合管道运算符”