字段的数据类型为字符串.我想获取字段名字符长度大于40的数据.

我try 了这些查询,但返回了错误.

db.usercollection.find(
{$where: "(this.name.length > 40)"}
).limit(2);

output :error: {
    "$err" : "TypeError: Cannot read property 'length' of undefined near '40)' ",
    "code" : 16722
}

这在2.4.9版本中有效,但我的版本是2.6.5

推荐答案

For MongoDB 3.6 and newer:

100运算符允许在查询语言中使用聚合表达式,因此您可以利用101运算符判断字符串的长度,如下所示:

db.usercollection.find({ 
    "name": { "$exists": true },
    "$expr": { "$gt": [ { "$strLenCP": "$name" }, 40 ] } 
})

For MongoDB 3.4 and newer:

您还可以将聚合框架与100管道操作符一起使用,它允许您使用101操作符处理逻辑条件,并使用特殊操作102"保留"逻辑条件为真的文档,或使用103"删除"条件为假的文档.

此操作类似于使用100管道 Select 集合中的字段,并创建一个新字段,该字段保存逻辑条件查询的结果,然后创建一个后续的101,只是102使用一个更高效的管道阶段.

至于逻辑条件,有String Aggregation Operators个可以使用101运算符来判断字符串的长度.如果长度是指定的值,那么这是一个真正的匹配,文档被"保留".否则它会被"修剪"并丢弃.


考虑运行下面的聚合操作来演示上面的概念:

db.usercollection.aggregate([
    { "$match": { "name": { "$exists": true } } },
    {
        "$redact": {
            "$cond": [
                { "$gt": [ { "$strLenCP": "$name" }, 40] },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    },
    { "$limit": 2 }
])

如果使用$where,请try 不带括号的查询:

db.usercollection.find({$where: "this.name.length > 40"}).limit(2);

更好的查询是判断字段是否存在,然后判断长度:

db.usercollection.find({name: {$type: 2}, $where: "this.name.length > 40"}).limit(2); 

或者:

db.usercollection.find({name: {$exists: true}, $where: "this.name.length > 
40"}).limit(2); 

MongoDB在$where个表达式和非$where个查询语句可能使用索引之前判断非$where个查询操作.更好的性能是将字符串的长度存储为另一个字段,然后可以对其进行索引或搜索;相比之下,申请$where将慢得多.当您无法以任何其他方式构造数据时,或者当您处理


避免使用$where运算符的另一种更快的方法是101运算符.考虑下面的模式搜索

db.usercollection.find({"name": {"$type": 2, "$regex": /^.{41,}$/}}).limit(2); 

Note-从100开始:

如果该字段存在索引,则MongoDB与常规索引匹配

如果正则表达式以

此外,虽然/^a/, /^a.*/,/^a.*$/相当

Mongodb相关问答推荐

如何$匹配在命令列表中查找确切的命令

更新查询mongoose 中的礼宾更新字段

在一个视图中连接两个集合MongoDB;展开有什么作用?

字段$set聚合导致错误美元($)前缀字段$concatArrays对于存储无效"

如何根据两个 struct 创建一个Mongo文档?

最有效的Mongo聚合来展开和过滤:匹配、展开、匹配与投影和过滤

在服务器上部署后端时判断??=默认判断

MongoDB 投影按数组中的字符串长度排序

如何获取键值对的对象,其中值仅具有 mongoDB 中的投影字段

如何在MongoDB中搜索有序子集的方法?

Kotlin 使用初级构造实例化公开类

我可以在 MongoDB 中将字段值设置为对象键吗?

DB.collection('comments').find() 不工作

MongoDB C# 驱动程序 2.0 InsertManyAsync 与 BulkWriteAsync

你如何让 mongo 在远程服务器上运行?

如何在任意深度查找 MongoDB 字段名称

MongoDB:如何在 100 个集合中找到 10 个随机文档?

使用 MongoDB 的 map/reduce 来分组两个字段

如何在mongoose的嵌套填充中 Select 特定字段

聚合 $lookup 匹配管道中文档的总大小超过最大文档大小