วิธีสอบถาม MongoDB ด้วยคำว่า“ like”


1437

ฉันต้องการสืบค้นด้วย SQL ของlikeแบบสอบถาม:

SELECT * FROM users  WHERE name LIKE '%m%'

ฉันจะทำเช่นเดียวกันใน MongoDB ได้อย่างไร? ฉันไม่สามารถหาผู้ดำเนินการสำหรับlikeในเอกสาร


7
ดูเอกสารของ mongodb: การค้นหาขั้นสูง - นิพจน์ทั่วไปmongodb.org/display/DOCS/…
douyw

7
คำถามของคุณมี5คะแนนอย่างน้อยสำหรับแท็กตัวดำเนินการเหมือนกัน ฉันขอความกรุณาให้คุณแนะนำsql-likeเป็นคำเหมือนได้ไหม
มิต

3
ลิงค์นี้อาจช่วยคุณgoo.gl/gdTYK8
Dilip Kr Singh เมื่อ

คำตอบ:


1945

นั่นจะต้องเป็น:

db.users.find({"name": /.*m.*/})

หรือคล้ายกัน:

db.users.find({"name": /m/})

คุณกำลังมองหาบางอย่างที่มี "m" อยู่ที่ไหนซักแห่ง (SQL's '%ตัวดำเนินการนั้นเทียบเท่ากับ Regexp's ' .*') ไม่ใช่สิ่งที่มี "m" ยึดไว้กับจุดเริ่มต้นของสตริง

บันทึก: mongodb ใช้นิพจน์ทั่วไปซึ่งมีประสิทธิภาพมากกว่า "LIKE" ใน sql ด้วยการแสดงออกปกติคุณสามารถสร้างรูปแบบใด ๆ ที่คุณจินตนาการ

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการแสดงออกปกติอ้างอิงถึงลิงค์นี้ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions


96
ค้นหาโดย regex แพงไหม
Freewind

147
จริงๆแล้วมันขึ้นอยู่กับ หากแบบสอบถามไม่ได้ใช้ดัชนีและต้องทำการสแกนตารางก็อาจมีราคาแพงอย่างแน่นอน หากคุณกำลังทำแบบสอบถามแบบ 'เริ่มต้นด้วย' regex แสดงว่าสามารถใช้ดัชนีได้ ดีที่สุดในการเรียกใช้อธิบาย () เพื่อดูว่าเกิดอะไรขึ้น
Kyle Banker

35
เมื่อไม่ยึดกับจุดเริ่มต้นของสตริงมันค่อนข้างแพง แต่แล้วอีกครั้งดังนั้นจึงเป็นLIKEแบบสอบถามใน SQL
Emily

4
ดังนั้นตราบใดที่มันยึดกับจุดเริ่มต้นของสตริงมันก็โอเค? เย็นแล้ว หมายความว่าเราต้องเพิ่ม ^
user4951

44
ฉันจะเพิ่ม regex ijavascript db.users.find({ "name": { $regex: /m/i } })
Doron Segal

368
db.users.insert({name: 'paulo'})
db.users.insert({name: 'patric'})
db.users.insert({name: 'pedro'})

db.users.find({name: /a/})  //like '%a%'

out: paulo, patric

db.users.find({name: /^pa/}) //like 'pa%' 

out: paulo, patric

db.users.find({name: /ro$/}) //like '%ro'

ออก: pedro


เป็นตัวอย่างที่ดี! ฉันกำลังตรวจสอบจุดสิ้นสุดพร้อมพื้นที่และพบสิ่งนี้ :) / $ /
Phuong

คุณจะค้นหาชื่อทั้งหมดได้อย่างไร หรือไวด์การ์ดสำหรับ * ใน SQL สิ่งที่ไม่ select name from users;เพียงแสดงรายชื่อผู้ใช้ทั้งหมดหรือไม่
anon58192932

1
@ anon58192932 หากต้องการแสดงรายการเฉพาะฟิลด์ "ชื่อ" ทั้งหมดในตารางชื่อ "ผู้ใช้" คุณสามารถใช้วิธีการ project () โดยการตั้งค่าของฟิลด์ที่คุณต้องการ 1. ฟิลด์ที่ไม่ได้กล่าวถึงในโครงการ () จะไม่เป็น ดึงข้อมูลยกเว้น _id ฟิลด์ _id จะถูกพิมพ์ตามค่าเริ่มต้นซึ่งคุณสามารถระงับได้โดยใส่ค่า 0 สำหรับเมธอด _id ภายใน project () สิ่งที่ต้องการ - db.collection.find (). project ({name: 1, _id: 0}) .toArray (ฟังก์ชั่น (err, docs) {console.log (docs); callback (docs);}); แนะนำสิ่งนี้ - docs.mongodb.com/manual/tutorial/…
gauravparmar

282

ใน

  • PyMongoใช้Python
  • พังพอนใช้Node.js
  • Jongoโดยใช้Java
  • mgoใช้Go

คุณทำได้:

db.users.find({'name': {'$regex': 'sometext'}})

2
มันใช้งานได้ดีสำหรับการค้นหาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่คุณช่วยบอกฉันหน่อยได้ไหมว่าฉันจะทำให้มันทำงานได้อย่างไรเพื่อทำการค้นหาแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
Tahir Yasin

สิ่งที่จะเป็น regex สำหรับ%sometext%
Tahir Yasin

64
@TahirYasin หากคุณยังสงสัยอยู่การค้นหาแบบตัวเล็กและตัวพิมพ์ใหญ่จะทำเช่นนี้:db.users.find({'name': {'$regex': 'sometext', '$options': 'i'}})
sumowrestler

ฉันแก้ไขใน golang โดยใช้ mgo เพียงแค่รหัสเช่นนี้ selector: = bson.M {"ช่าง": bson.M {"$ regex": tech}}
Sandun Priyanka

1
รู้สึกเช่นนี้ควรเป็นคำตอบที่ยอมรับได้ มันง่ายและสง่างามที่สุดในปัจจุบัน
Brett84c

88

ใน PHP คุณสามารถใช้รหัสต่อไปนี้:

$collection->find(array('name'=> array('$regex' => 'm'));

4
python + mongoengine: people = People.objects.raw_query ({'ชื่อ': {'$ regex': 'm'}})
panchicore

1
หากค่า RegEx ของคุณมาจากการป้อนข้อมูลผู้ใช้ (เช่นแบบฟอร์มตัวกรอง) และคุณไม่ต้องการให้ค่าตัวเองถูกใช้เป็น RegExp คุณควรใช้ preg_quote () กับมัน
Philipp Rieber

2
ฉันเพิ่งเข้าใจสิ่งนี้ แต่นี่เป็นคำตอบที่ผิดจริงถึงแม้ว่ามันจะทำงานได้ดี แต่คุณควรใช้ BSON regex object จริงผ่าน MongoRegex แต่ $ regex มีปัญหาความเข้ากันได้กับคำสั่งบางอย่างเช่น $ in
Sammaye

ไวยากรณ์นี้มีประโยชน์หากค่าถูกเก็บไว้ในตัวแปรดังนั้นเคียวรีสามารถเขียนเป็น (ใน Ruby):$collection.where(field => {"$regex" => value})
Donny Kurnia

แต่ทำไมคุณไม่ใช้ตัวอักษรแถวลำดับ?
เปอร์

53

คุณจะใช้ regex สำหรับสิ่งนั้นในภาษามองโกเลีย

เช่น: db.users.find({"name": /^m/})


29
ฉันคิดว่านี่จะแสดงเฉพาะเอกสารที่มีค่าชื่อที่ขึ้นต้นด้วย "m"
JackAce

53

มีคำตอบมากมายอยู่แล้ว ฉันกำลังให้ความต้องการและแนวทางแก้ไขปัญหาต่าง ๆ สำหรับการค้นหาสตริงด้วย regex

คุณสามารถทำกับ regex ซึ่งมีคำเช่น like นอกจากนี้คุณสามารถใช้$options => iสำหรับการค้นหาที่ไม่คำนึงถึงขนาดตัวพิมพ์

มี string

db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}})

ไม่ได้stringมีเฉพาะกับ regex

db.collection.find({name:{'$regex' : '^((?!string).)*$', '$options' : 'i'}})

กรณีที่ไม่มีความรู้สึกแน่นอน string

db.collection.find({name:{'$regex' : '^string$', '$options' : 'i'}})

เริ่มกับ string

db.collection.find({name:{'$regex' : '^string', '$options' : 'i'}})

จบด้วย string

db.collection.find({name:{'$regex' : 'string$', '$options' : 'i'}})

เก็บสิ่งนี้ไว้เป็นที่คั่นหนังสือและเป็นข้อมูลอ้างอิงสำหรับการเปลี่ยนแปลงอื่น ๆ ที่คุณอาจต้องการ


37

คุณมี 2 ทางเลือก:

db.users.find({"name": /string/})

หรือ

db.users.find({"name": {"$regex": "string", "$options": "i"}})

ในตัวที่สองคุณมีตัวเลือกเพิ่มเติมเช่น "i" ในตัวเลือกเพื่อค้นหาโดยใช้ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ และเกี่ยวกับ "สตริง" คุณสามารถใช้เช่น " สตริง " (% string%) หรือ "string. *" (สตริง%) และ ". * string) (% string) ตัวอย่างเช่นคุณสามารถใช้นิพจน์ปกติ ตามที่คุณต้องการ.

สนุก!


34

ถ้าใช้Node.js , มันบอกว่าคุณสามารถเขียนนี้:

db.collection.find( { field: /acme.*corp/i } );
//or
db.collection.find( { field: { $regex: 'acme.*corp', $options: 'i' } } );

นอกจากนี้คุณสามารถเขียนสิ่งนี้:

db.collection.find( { field: new RegExp('acme.*corp', 'i') } );

ไวยากรณ์ที่คล้ายกันใน Ruby:collection.where(field => Regexp.new(value))
Donny Kurnia

24

คุณได้คำตอบแล้ว แต่เพื่อจับคู่ regex กับ case insensitivity

คุณสามารถใช้แบบสอบถามต่อไปนี้

db.users.find ({ "name" : /m/i } ).pretty()

iใน/m/iบ่งชี้กรณีไม่รู้สึกและ.pretty()ให้ผลผลิตที่สวยมากขึ้น


แต่ถ้าฉันต้องการตั้งค่าแบบไดนามิกที่นี่
KS

@KuldeepKoranga คุณสามารถวางค่าแบบไดนามิกใด ๆ แทน 'm' นั่นคือสิ่งที่คุณต้องการ.
The6thSense

var search="feacebook"ดังนั้นฉันจะตั้งค่าด้านล่าง @ The6thSens ได้db.users.find ({ "name" : /search/i } )อย่างไรแต่
KS

@KuldeepKoranga คุณได้กำหนดค่า
The6thSense

1
@KuldeepKoranga stackoverflow.com/questions/7790811/…ช่วยได้
ไหม


13

คุณสามารถใช้ฟีเจอร์ใหม่ของ 2.6 mongodb:

db.foo.insert({desc: "This is a string with text"});
db.foo.insert({desc:"This is a another string with Text"});
db.foo.ensureIndex({"desc":"text"});
db.foo.find({
    $text:{
        $search:"text"
    }
});

6
หมายเหตุการค้นหาข้อความของ AFAIK Mongodb ใช้ได้กับทั้งคำโดยปริยายเท่านั้นดังนั้นสิ่งนี้จะจับคู่ค่าเช่น "นี่คือสตริงที่มีข้อความ" แต่ไม่ใช่ "นี่คือสตริงที่มีคำบรรยาย" ดังนั้นจึงไม่เหมือนกับผู้ดำเนินการ "LIKE" ของ sql
rocketmonkeys

@Rocketmonkeys มันเป็นความจริง .. สำหรับบางอย่างเช่น "ตัวดำเนินการ LIKE" คุณจะใช้ตัวดำเนินการ $ regex mongo
cmarrero01

13

ในโปรเจ็กต์ nodejsและใช้พังพอนใช้Like การสืบค้น

var User = mongoose.model('User');

var searchQuery={};
searchQuery.email = req.query.email;
searchQuery.name = {$regex: req.query.name, $options: 'i'};
User.find(searchQuery, function(error, user) {
                if(error || user === null) {
                    return res.status(500).send(error);
                }
                return res.status(200).send(user);
            });

ฉันจะใช้เช่นแบบสอบถามได้อย่างไร ฉันได้ลองแล้ว แต่ยังไม่ทำงาน:searchQuery.product_name = '/'+req.query.search.value+'/i';
Muhammad Shahzad

ลองได้เช่น:searchQuery.product_name= {$regex: req.query.search.value, $options: 'i'};
Shaishab Roy

คุณช่วยชีวิตฉันเพื่อน คุณช่วยอธิบายได้นิดหน่อยว่า $ regex และ $ options คืออะไร?
มูฮัมหมัดชาห์ซาด

if(req.query.search.value){ searchQuery.product_name = {$regex: req.query.search.value, $options: 'i'}; searchQuery.sale_amount = {$regex: req.query.search.value, $options: 'i'}; searchQuery.sale_person = {$regex: req.query.search.value, $options: 'i'}; searchQuery.department_name = {$regex: req.query.search.value, $options: 'i'}; searchQuery.sale_date = {$regex: req.query.search.value, $options: 'i'}; }คุณช่วยลองดูสิว่าทำไมมันถึงไม่ทำงาน?
มูฮัมหมัดชาห์ซาด

ดี$regex: 'value' สร้างนิพจน์ปกติสำหรับค่าการค้นหาของคุณและ$options: 'i'วิธีกรณีตาย รหัสของคุณไม่ทำงานเนื่องจากคุณใช้ค่าเดียวกันสำหรับคุณสมบัติที่แตกต่างกันและทำหน้าที่เป็นและเงื่อนไขที่ไม่ควรปฏิบัติตามการรวบรวมฐานข้อมูล
Shaishab Roy

12

สำหรับ PHP mongo Like
ฉันมีปัญหาหลายอย่างกับ PHP Mongo เช่น ฉันพบว่าเชื่อมโยง params regex ช่วยในบางสถานการณ์PHP Mongo หาข้อมูลเริ่มต้นด้วย ฉันคิดว่าฉันจะโพสต์ที่นี่เพื่อมีส่วนร่วมในหัวข้อที่นิยมมากขึ้น

เช่น

db()->users->insert(['name' => 'john']);
db()->users->insert(['name' => 'joe']);
db()->users->insert(['name' => 'jason']);

// starts with
$like_var = 'jo';
$prefix = '/^';
$suffix = '/';
$name = $prefix . $like_var . $suffix;
db()->users->find(['name' => array('$regex'=>new MongoRegex($name))]);
output: (joe, john)

// contains
$like_var = 'j';
$prefix = '/';
$suffix = '/';
$name = $prefix . $like_var . $suffix;
db()->users->find(['name' => array('$regex'=>new MongoRegex($name))]);

output: (joe, john, jason)

ตามคำตอบก่อนหน้าและความคิดเห็นการค้นหา $ text (ดัชนี) จะให้ทางออกที่ดีกว่าด้วยมาตรฐานเปรียบเทียบกับวิธีการ $ regex ที่ถูกต้อง สำหรับการอ้างอิงตรวจสอบการเชื่อมโยงนี้stackoverflow.com/questions/10610131/... เป็นไปได้หรือไม่ที่จะใช้วิธี $ text index กับ PHP และ mongoDB
sankar muniyappa

12

การใช้เทมเพลตตัวอักษรกับตัวแปรใช้งานได้:

{"firstname": {$regex : `^${req.body.firstname}.*` , $options: 'si' }}


นี่คือ searchig จากการเริ่มต้น ex - ถ้า "firstname" มี testlast และถ้าฉันค้นหาด้วย "last" มันจะไม่ให้ผลลัพธ์
Vikas Chauhan

11

ด้วย MongoDB Compass คุณต้องใช้ไวยากรณ์โหมดเข้มงวดเช่น:

{ "text": { "$regex": "^Foo.*", "$options": "i" } }

(ใน MongoDB Compass สิ่งสำคัญคือคุณต้องใช้"แทน')


10

คุณสามารถใช้คำสั่ง where เพื่อสร้างสคริปต์ JS:

db.myCollection.find( { $where: "this.name.toLowerCase().indexOf('m') >= 0" } );

การอ้างอิง: http://docs.mongodb.org/manual/reference/operator/where/


9
$whereไม่มีประสิทธิภาพสูง ทำการสแกนคอลเลกชันแบบเต็ม :(
Sushant Gupta

อาไม่มีปัญหาฉันกำลังบอกแบบนั้น: D
Sushant Gupta

10

ใน SQL แบบสอบถาม ' like ' จะมีลักษณะดังนี้:

select * from users where name like '%m%'

ในคอนโซล MongoDB ดูเหมือนว่า:

db.users.find({"name": /m/})     // Not JSON formatted

db.users.find({"name": /m/}).pretty()  // JSON formatted

ในpretty()วิธีการเพิ่มเติมจะอยู่ในสถานที่ทั้งหมดที่สร้างโครงสร้าง JSON ที่จัดรูปแบบซึ่งสามารถอ่านได้มากขึ้น


10

Regex มีราคาแพงเป็นกระบวนการ

อีกวิธีหนึ่งคือการสร้างดัชนีข้อความและค้นหาโดยใช้ $searchอีกวิธีหนึ่งคือการสร้างดัชนีข้อความแล้วค้นหาโดยใช้

สร้างดัชนีข้อความของเขตข้อมูลที่คุณต้องการให้ค้นหาได้:

db.collection.createIndex({name: 'text', otherField: 'text'});

ค้นหาสตริงในดัชนีข้อความ:

db.collection.find({
  '$text'=>{'$search': "The string"}
})

โซลูชั่นที่สมบูรณ์แบบ ... Regex เป็นวิธีที่มีราคาแพง การทำงานกับชุดข้อมูลขนาด 20 ม. เอกสารและความแตกต่างด้านประสิทธิภาพเป็นสิ่งที่สังเกตได้ชัดเจนมาก (ซึ่งเป็นการพูดน้อย)
nivensookharan

1
อันที่จริงมันใช้งานได้กับคำทั้งหมดเท่านั้นดูdocs.mongodb.com/manual/core/index-text/#index-entries
Thomas Ebert

8

ในระหว่างเดินทางและไดรเวอร์ mgo:

Collection.Find(bson.M{"name": bson.RegEx{"m", ""}}).All(&result)

โดยที่ result เป็นอินสแตนซ์ struct ของการค้นหาหลังจากพิมพ์


2
กรุณาหลีกเลี่ยงฟิลด์ที่ไม่มีคีย์เป็นตัวอักษรให้ทำbson:RegEx{Pattern:"m", Options:"i"}แทน
Bithavoc

8

ใช้การจับคู่นิพจน์ทั่วไปดังต่อไปนี้ เครื่องหมาย 'i' แสดงถึงความรู้สึกตัวพิมพ์เล็กและตัวพิมพ์ใหญ่

var collections = mongoDatabase.GetCollection("Abcd");

var queryA = Query.And(
         Query.Matches("strName", new BsonRegularExpression("ABCD", "i")), 
         Query.Matches("strVal", new BsonRegularExpression("4121", "i")));

var queryB = Query.Or(
       Query.Matches("strName", new BsonRegularExpression("ABCD","i")),
       Query.Matches("strVal", new BsonRegularExpression("33156", "i")));

var getA = collections.Find(queryA);
var getB = collections.Find(queryB);

6

เช่นเดียวกับ Query จะเป็นดังที่แสดงไว้ด้านล่าง

db.movies.find({title: /.*Twelve Monkeys.*/}).sort({regularizedCorRelation : 1}).limit(10);

สำหรับสกาล่าReactiveMongo api

val query = BSONDocument("title" -> BSONRegex(".*"+name+".*", "")) //like
val sortQ = BSONDocument("regularizedCorRelation" -> BSONInteger(1))
val cursor = collection.find(query).sort(sortQ).options(QueryOpts().batchSize(10)).cursor[BSONDocument]

6

มันดูเหมือนว่าจะมีเหตุผลสำหรับการใช้งานจาวาสคริปต์ทั้ง/regex_pattern/รูปแบบเช่นเดียวกับ Mongo {'$regex': 'regex_pattern'}รูปแบบ ดู: MongoBD RegEx Syntax Restrictions

นี้ไม่ได้เป็นกวดวิชา RegEx สมบูรณ์ แต่ผมได้แรงบันดาลใจที่จะเรียกใช้การทดสอบเหล่านี้หลังจากที่ได้เห็นการโหวตโพสต์คลุมเครือสูงดังกล่าวข้างต้น

> ['abbbb','bbabb','bbbba'].forEach(function(v){db.test_collection.insert({val: v})})

> db.test_collection.find({val: /a/})
{ "val" : "abbbb" }
{ "val" : "bbabb" }
{ "val" : "bbbba" }

> db.test_collection.find({val: /.*a.*/})
{ "val" : "abbbb" }
{ "val" : "bbabb" }
{ "val" : "bbbba" }

> db.test_collection.find({val: /.+a.+/})
{ "val" : "bbabb" }

> db.test_collection.find({val: /^a/})
{ "val" : "abbbb" }

> db.test_collection.find({val: /a$/})
{ "val" : "bbbba" }

> db.test_collection.find({val: {'$regex': 'a$'}})
{ "val" : "bbbba" }

5

หากคุณกำลังใช้ Mongodb Spring-Data คุณสามารถทำได้ดังนี้

String tagName = "m";
Query query = new Query();
query.limit(10);        
query.addCriteria(Criteria.where("tagName").regex(tagName));

4

ในฐานะที่เป็น Mongo shell สนับสนุน regex เป็นไปได้อย่างสมบูรณ์

db.users.findOne({"name" : /.*sometext.*/});

หากเราต้องการให้แบบสอบถามเป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เราสามารถใช้ตัวเลือก "i" ดังที่แสดงด้านล่าง:

db.users.findOne({"name" : /.*sometext.*/i});


4

ใช้การค้นหาสตริงย่อยการรวม (พร้อมดัชนี !!!):

db.collection.aggregate([{
        $project : {
            fieldExists : {
                $indexOfBytes : ['$field', 'string']
            }
        }
    }, {
        $match : {
            fieldExists : {
                $gt : -1
            }
        }
    }, {
        $limit : 5
    }
]);

ดี! มีวิธีที่จะทำให้เอกสารทั้งหมดตรงกันหรือไม่? หรือทำให้กรอบการรวมทำแบบสอบถามติดตามเพื่อทำเช่นนั้น? ในขณะนี้การแข่งขันจะมีลักษณะดังนี้:{ "_id" : ObjectId("5aba5ad988385120a01b1ac2"), "fieldExists" : 4 }
Gianfranco P.

ในขั้นตอน $ project ให้ฉายภาพสิ่งที่คุณต้องการ
Vokail

4

สตริง deepakparmar, dipak, parmar

db.getCollection('yourdb').find({"name":/^dee/})

ans deepakparmar

db.getCollection('yourdb').find({"name":/d/})

และdeepakparmar, dipak

db.getCollection('yourdb').find({"name":/mar$/})

ans deepakparmar, parmar


2

ฉันพบเครื่องมือฟรีในการแปลแบบสอบถาม MYSQL เป็น MongoDB http://www.querymongo.com/ ฉันตรวจสอบด้วยคำค้นหาหลายข้อ เท่าที่ฉันเห็นพวกเขาเกือบทั้งหมดถูกต้อง ตามที่คำตอบคือ

db.users.find({
    "name": "%m%"
});

2

MongoRegex เลิกใช้แล้ว
ใช้ MongoDB \ BSON \ Regex

$regex = new MongoDB\BSON\Regex ( '^m');
$cursor = $collection->find(array('users' => $regex));
//iterate through the cursor

มันเป็นสิ่งสำคัญที่จะทราบว่านี้หมายถึงระดับ MongoRegex ใน PHP ไม่เกี่ยวข้องกับคำถามนี้มากซึ่งเกี่ยวกับโหนด นี่อาจเป็นข้อคิดเห็นหรือดีกว่า - คำถามที่ตอบตัวเองในโพสต์แยก
Boaz - Reinstate Monica

2
db.customer.find({"customerid": {"$regex": "CU_00000*", "$options": "i"}}).pretty()

เมื่อเรากำลังค้นหารูปแบบสตริงจะเป็นการดีกว่าถ้าใช้รูปแบบด้านบนเหมือนกับกรณีที่เราไม่แน่ใจเกี่ยวกับตัวพิมพ์ใหญ่ หวังว่าจะช่วย !!!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.