当我需要用一个 and 子句分隔查询时,在 mongoose 中有两个 "or" 子句
having two "or" clauses in mongoose when I need to separate the query with an and clause
我想查询 mongo 以获得 "unexpired or evergreen(posts with null expiration) posts created or bookmarked by me"
我的查询的问题是 mongoose 将 or 语句组合在一起,所以我得到的是 (unexpired or evergreen or mine or bookmarked)
而不是 ( (unexpired or evergreen) and (mine or bookmarked) )
如何将 mongoose 查询更改为我上面概述的后一种正确情况。我应该使用 "and" 子句...还是应该做一个 not(expiration > now) ?
var query =
Invite.find({ isActive:true })
.or([
{ 'expiration': {$gt: new Date()} },
{ 'expiration' : null }
])
.or([
{ createdBy:userId },
{ 'bookmarked.id' : userId }
])
您可以使用 Query#and
帮助程序将两个 $or
子句放入一个 $and
中:
var query =
Invite.find({ isActive:true })
.and([
{$or: [
{ 'expiration': {$gt: new Date()} },
{ 'expiration': null }
]},
{$or: [
{ 'createdBy': userId },
{ 'bookmarked.id' : userId }
]}
])
这是我认为 "helper" 方法并没有多大帮助的地方,因为它们混淆了问题。 JavaScript 是一种动态类型语言,因此您不需要这些辅助方法来定义构成查询的数据结构。 MongoDB 的所有本机运算符仅在单个查询路径中被接受:
Invite.find(
{
"isActive": true,
"$and": [
{ "$or": [
{ "expiration": null },
{ "expiration": { "$gt": new Date() } }
]},
{ "$or": [
{ "createdBy": userId }
{ "bookmarked.id": userId }
]}
]
},
function(err,result) {
}
);
我想查询 mongo 以获得 "unexpired or evergreen(posts with null expiration) posts created or bookmarked by me"
我的查询的问题是 mongoose 将 or 语句组合在一起,所以我得到的是 (unexpired or evergreen or mine or bookmarked)
而不是 ( (unexpired or evergreen) and (mine or bookmarked) )
如何将 mongoose 查询更改为我上面概述的后一种正确情况。我应该使用 "and" 子句...还是应该做一个 not(expiration > now) ?
var query =
Invite.find({ isActive:true })
.or([
{ 'expiration': {$gt: new Date()} },
{ 'expiration' : null }
])
.or([
{ createdBy:userId },
{ 'bookmarked.id' : userId }
])
您可以使用 Query#and
帮助程序将两个 $or
子句放入一个 $and
中:
var query =
Invite.find({ isActive:true })
.and([
{$or: [
{ 'expiration': {$gt: new Date()} },
{ 'expiration': null }
]},
{$or: [
{ 'createdBy': userId },
{ 'bookmarked.id' : userId }
]}
])
这是我认为 "helper" 方法并没有多大帮助的地方,因为它们混淆了问题。 JavaScript 是一种动态类型语言,因此您不需要这些辅助方法来定义构成查询的数据结构。 MongoDB 的所有本机运算符仅在单个查询路径中被接受:
Invite.find(
{
"isActive": true,
"$and": [
{ "$or": [
{ "expiration": null },
{ "expiration": { "$gt": new Date() } }
]},
{ "$or": [
{ "createdBy": userId }
{ "bookmarked.id": userId }
]}
]
},
function(err,result) {
}
);