转载:http://forum.foxera.com/mongo...
之前在使用SQL时,我们经常会使用到Len()函数来返回文本字段中值的长度。那Mongodb是否有这样的操作呢,在version 3.4增加了此功能$strLenCP 如:有一个客户购买商品信息集合orderdetail
{"_id": ObjectId("5821757bf28fbb3e3516eeaa"), "memid" : "f5869354", "orderno" : "s00023","productno":"20206539", "comment":"这个平底锅太好用了,性价比高","telephone" :"18385669845"}
{"_id": ObjectId("5821776ff28fbb3e3516eeab"), "memid" : "daisy", "orderno" : "s04567", "productno":"20225699","address":"comment","衣服穿起来很舒服好评" :"18855448645"}
{"_id": ObjectId("5821829ef28fbb3e3516eeac"), "memid" : "lucy", "orderno" : "s08795", "productno":"20256339","address":"comment","还行" :"13869669585"}
{"_id": ObjectId("582182b0f28fbb3e3516eead"), "memid" : "c5633256", "orderno" : "s45689","productno":"20285639","address":"comment","不好用,不建议买" :"13699869588"}
我们想统计客户评论信息的长度,操作如下:
db.orderdetail.aggregate(
[
{
$project: {
"_id":0,
"orderno": 1,
"productno":1,
"comlength": { $strLenCP: "$comment" }
}
}
]
)
{"orderno" : "s00023", "productno":"20206539", "comlength":14}
{"orderno" : "s04567", "productno":"20225699", "comlength":10}
{"orderno" : "s08795", "productno":"20256339", "comlength":2}
{"orderno" : "s45689", "productno":"20285639", "comlength":8}
这样就可以得出长度,也可以通过这个length继续后面的分析
比如说想看看评论长度大于10的商品
db.orderdetail.aggregate(
[
{
$project: {
"_id":0,
"orderno": 1,
"productno":1,
"comlength": { $strLenCP: "$comment" }
}
},
{
$match:{comlength:{$gt:10}}
}
]
)
{"orderno" : "s00023", "productno":"20206539", "comlength":14}
需要注意一点的是$strLenCP和$strLenBytes功能相近,但是在统计字符的时候有区别
$strLenByte会区分字符类型,比如:汉字会默认为3个字节,特殊字符如€为3个字节,λ为2个字节,é也为2个字节
当然想要实现上述功能,还可以通过$where来实现,但是多数情况下都避免使用$where查询,比常规查询慢很多,每个文档都要从BSON转换成JavaScript对象,然后通过$where表达式来运行,而且不能使用索引。这样看来通过管道操作来实现会是不错的选择。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。