Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

ค้นหาเอกสาร MongoDB จากการรวม FirstName และ LastName

เมื่อต้องการค้นหาจากการรวมฟิลด์ (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: ใช้เงื่อนไขในการกรองเอกสาร

วิธีนี้มีประโยชน์เมื่อต้องค้นหาจากฟิลด์ที่แยกเก็บแต่ผู้ใช้ค้นหาเป็นชื่อเต็ม