it-swarm.dev

طول قيمة حقل السلسلة في 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

54
SURYA GOKARAJU

هنا واحدة من الطريق في mongodb يمكنك تحقيق ذلك.

db.usercollection.find({ $where: 'this.name.length < 4' })
5
Rajdeep Gautam

كان لديّ نوع مشابه من السيناريو ، لكن في حالتي ، ليست السمة من المستوى الأول. إنه داخل كائن. هنا لم أجد إجابة مناسبة لذلك. لذلك اعتقدت أن أشارككم جميعًا في حلي (آمل أن يساعد هذا أي شخص في مشكلة مماثلة).

Parent Collection 

{
"Child":
{
"name":"Random Name",
"Age:"09"
}
}

على سبيل المثال: إذا كنا بحاجة إلى الحصول على مجموعات فقط يزيد طول اسم الطفل عن 10 أحرف.

 db.getCollection('Parent').find({$where: function() { 
for (var field in this.Child.name) { 
    if (this.Child.name.length > 10) 
        return true;

}
}})
2
Udara Gunathilake

الاستعلامات التي تحتوي على $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
})

هذا الاستعلام هو نفس المعنى مع

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
Fumiya Karasawa