我想查询mongo是否为“未过期或常青(有空过期的帖子)帖子创建或收藏我”
我的查询存在的问题是,mongoose将or或者语句组合在一起,因此我错误地获取了(unexpired or evergreen or mine or bookmarked)
而不是( (unexpired or evergreen) and (mine or bookmarked) )
如何将mongoose查询更改为后面我概述的后一个正确的案例。我应该使用“和”条款......或者我应该做一个不(过期>现在)?
var query =
Invite.find({ isActive:true })
.or([
{ 'expiration': {$gt: new Date()} },
{ 'expiration' : null }
])
.or([
{ createdBy:userId },
{ 'bookmarked.id' : userId }
])
答案 0 :(得分:3)
您可以使用Query#and
帮助将两个$or
子句放入单个$and
中:
var query =
Invite.find({ isActive:true })
.and([
{$or: [
{ 'expiration': {$gt: new Date()} },
{ 'expiration': null }
]},
{$or: [
{ 'createdBy': userId },
{ 'bookmarked.id' : userId }
]}
])
答案 1 :(得分:0)
这就是我认为“辅助”方法并没有真正起作用的地方,因为它们使问题混乱。 JavaScript是一种动态类型语言,因此您不需要这些辅助方法来定义构成查询的数据结构。 MongoDB的所有本机运算符都只接受在单个查询路径中:
Invite.find(
{
"isActive": true,
"$and": [
{ "$or": [
{ "expiration": null },
{ "expiration": { "$gt": new Date() } }
]},
{ "$or": [
{ "createdBy": userId }
{ "bookmarked.id": userId }
]}
]
},
function(err,result) {
}
);