$match 与 $gte 和 $lte 不适用于 mongodb 中的数组? [复制]
Posted
技术标签:
【中文标题】$match 与 $gte 和 $lte 不适用于 mongodb 中的数组? [复制]【英文标题】:$match with $gte and $lte not working for an array in mongodb? [duplicate] 【发布时间】:2018-09-28 12:09:59 【问题描述】:我在Query for documents where array size is greater than 1 上发现了一些相关的内容,它适用于find
,但不适用于aggregation
查询...
我有以下用户集合...
"_id" : ObjectId("5ac8b91482c2345af70d4650"),
"firstName" : "Clerk",
"lastName" : "Kent",
"email" : "clerk@ltc.com",
"endorsedBy" : [],
"followings" : [],
"followers" : [],
"isAdminEndorsed" : false,
"_id" : ObjectId("5ac8ba3582c2345af70d4658"),
"firstName" : "Bruce",
"lastName" : "Wayne",
"email" : "bruce@linkites.com",
"endorsedBy" : [],
"followings" : [
ObjectId("5acc97b817c27b258bc9aa1e")
],
"followers" : [],
"isAdminEndorsed" : false
"_id" : ObjectId("5acc97b817c27b258bc9aa1e"),
"firstName" : "admin",
"lastName" : "ltc",
"email" : "superadmin@ltc.com",
"endorsedBy" : [],
"followings" : [],
"followers" : [
ObjectId("5ac8ba3582c2345af70d4658")
],
"isAdminEndorsed" : true
"_id" : ObjectId("5ad6ed4b7730923118b399a7"),
"firstName" : "Batman",
"lastName" : "tge",
"email" : "ashishlal95@gmail.com",
"endorsedBy" : [
ObjectId("5ad6ed4b7730923118b399a7"),
ObjectId("5ad6ed4b7730923118b399a7"),
ObjectId("5ad6ed4b7730923118b399a7"),
ObjectId("5ad6ed4b7730923118b399a7"),
ObjectId("5ad6ed4b7730923118b399a7"),
ObjectId("5ad6ed4b7730923118b399a7"),
ObjectId("5ad6ed4b7730923118b399a7"),
ObjectId("5ad6ed4b7730923118b399a7"),
ObjectId("5ad6ed4b7730923118b399a7"),
ObjectId("5ad6ed4b7730923118b399a7"),
ObjectId("5ad6ed4b7730923118b399a7")
],
"followings" : [],
"followers" : [],
"isAdminEndorsed" : false
我想要用户列表
1) 未登录的用户。
2) endorsedBy 长度应小于 10。
3) isAdminEndorsed 应该是假的。
4) 名字应该匹配正则表达式“cle”。
我尝试了以下查询但不起作用...这里有什么我遗漏的...
const user = await User.aggregate([
$match:
_id:
$ne: mongoose.Types.ObjectId(req.user.id)
,
$and: [ endorsedBy: $lt: 10 , isAdminEndorsed: false ]
,
$project:
isFollow: $in: [mongoose.Types.ObjectId(req.user.id),
'$followers'] ,
])
我的输出应该是
"_id" : ObjectId("5ac8b91482c2345af70d4650"),
"firstName" : "Clerk",
"lastName" : "Kent"
【问题讨论】:
您应该使用$size
来检查数组大小。
@AshishChoudhary 它在 v3.6 中肯定可以。请参阅我的答案中的代码。您使用的是哪个版本的 bd?
$exists
测试绝对有效,而且它仍然是迄今为止性能最高、最可靠的答案。进行琐碎的编辑和虚假陈述不是重新提出问题的理由。实际上按照答案所说的去做。正如我已经提到的,这里给出的唯一其他答案要么是该逻辑的“副本”,要么是错误的。直接复制。
【参考方案1】:
您应该检查数组中的absence
或10th element
。
在适当的猫鼬更改后尝试此查询:
如果您不想要不区分大小写的搜索,请记住进行适当的更改,并且此处不需要$and
运算符。
db.sample.aggregate([
$match:
_id: $ne: ObjectId("5ac8ba3582c2345af70d4658"),
isAdminEndorsed: false,
"endorsedBy.9":$exists:false,
firstName:$regex:"cle", $options:"i"
,
$project:
isFollow: $in: [ObjectId("5ac8b91482c2345af70d4650"),
'$followers'] ,
])
输出:
"_id" : ObjectId("5ac8b91482c2345af70d4650"),
"isFollow" : false
【讨论】:
谢谢...我正在检查...以上是关于$match 与 $gte 和 $lte 不适用于 mongodb 中的数组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose:如何通过聚合框架将 $gte 和 $lte 用于数组
$gte 和 $lte 在 Mongoose/MongoDB 中没有按预期工作
包含greaterThanEqual(gte)或lessThanEqual(lte)的Squeryl查询给出错误/无结果