Тип данных поля является Строкой. Я хотел бы выбрать данные, где длина знака имени поля больше, чем 40.
Я попробовал эти запросы, но возврат ошибки. 1.
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
Запросы с $where
и $expr
являются медленными, если существует слишком много документов.
Используя $regex
намного быстрее, чем $where
, $expr
.
db.usercollection.find({
"name": /^[\s\S]{40,}$/, // name.length >= 40
})
or
db.usercollection.find({
"name": { "$regex": "^[\s\S]{40,}$" }, // name.length >= 40
})
Этот запрос является тем же значением с [1 110]
db.usercollection.find({
"$where": "this.name && this.name.length >= 40",
})
or
db.usercollection.find({
"name": { "$exists": true },
"$expr": { "$gte": [ { "$strLenCP": "$name" }, 40 ] }
})
, я протестировал, каждый запрашивает для моего набора.
# find
$where: 10529.359ms
$expr: 5305.801ms
$regex: 2516.124ms
# count
$where: 10872.006ms
$expr: 2630.155ms
$regex: 158.066ms
Этот запрос даст и значение поля и длину:
db.usercollection.aggregate([
{
$project: {
"name": 1,
"length": { $strLenCP: "$name" }
}} ])