เมื่อต้องการค้นหาจากการรวมฟิลด์ (concatenation) เช่น FirstName + LastName ให้ใช้ $concat ร่วมกับ $eq ใน Aggregation Pipeline
> db.demo502.insertOne({"FirstName": "John", "LastName": "Smith"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e875534987b6e0e9d18f56d") }
> db.demo502.insertOne({"FirstName": "David", "LastName": "Miller"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e87553e987b6e0e9d18f56e") }
> db.demo502.insertOne({"FirstName": "John", "LastName": "Doe"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e875543987b6e0e9d18f56f") }
แสดงข้อมูล:
> db.demo502.find();
{ "_id" : ObjectId("5e875534987b6e0e9d18f56d"), "FirstName" : "John", "LastName" : "Smith" }
{ "_id" : ObjectId("5e87553e987b6e0e9d18f56e"), "FirstName" : "David", "LastName" : "Miller" }
{ "_id" : ObjectId("5e875543987b6e0e9d18f56f"), "FirstName" : "John", "LastName" : "Doe" }
คิวรีค้นหาชื่อเต็ม "John Doe"
> db.demo502.aggregate([
... { "$redact": {
... "$cond": [
... { "$eq": [
... { "$concat": ["$FirstName", " ", "$LastName"] },
... "John Doe"
... ]},
... "$$KEEP",
... "$$PRUNE"
... ]
... }}
... ]);
ผลลัพธ์:
{ "_id" : ObjectId("5e875543987b6e0e9d18f56f"), "FirstName" : "John", "LastName" : "Doe" }
วิธีอื่นที่ง่ายกว่า (แนะนำ)
ใช้ $expr ใน find() ตรงๆ จะเข้าใจง่ายกว่า:
> db.demo502.find({
... $expr: { $eq: [{ $concat: ["$FirstName", " ", "$LastName"] }, "John Doe"] }
... });
คำอธิบาย
- $concat: รวมสตริง FirstName + ช่องว่าง + LastName
- $eq: เปรียบเทียบกับค่าที่ต้องการ
- $redact / $expr: ใช้เงื่อนไขในการกรองเอกสาร
วิธีนี้มีประโยชน์เมื่อต้องค้นหาจากฟิลด์ที่แยกเก็บแต่ผู้ใช้ค้นหาเป็นชื่อเต็ม