$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】:

您应该检查数组中的absence10th 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 中没有按预期工作

65.ORM查询条件:gte,gt,lte和lt的使用

MongoDB 查询 lte 比 gte 快

包含greaterThanEqual(gte)或lessThanEqual(lte)的Squeryl查询给出错误/无结果

mongodb中比较($lt $lte $gt $gte)查询条件说明