Представьте длину значения поля в виде строки в mongoDB

Тип данных поля является Строкой. Я хотел бы выбрать данные, где длина знака имени поля больше, чем 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

61
задан 11 April 2015 в 15:32

2 ответа

Запросы с $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
0
ответ дан 31 October 2019 в 15:30

Этот запрос даст и значение поля и длину:

db.usercollection.aggregate([
{
    $project: {
        "name": 1,
        "length": { $strLenCP: "$name" }
    }} ])
0
ответ дан 31 October 2019 в 15:30

Другие вопросы по тегам:

Похожие вопросы: