Sử dụng $ifNull để xử lý trường hợp mảng là null. $ifNull đánh giá biểu thức và trả về giá trị nếu biểu thức không phải null.
Tạo collection với các trường hợp: mảng có giá trị, mảng null, thiếu trường:
> db.demo542.insertOne({"ListOfName":["Chris","David"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8cabc6ef4dcbee04fbbc17") }
> db.demo542.insertOne({"ListOfName":null});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8cabc8ef4dcbee04fbbc18") }
> db.demo542.insertOne({"ListOfName":["David"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8cabd3ef4dcbee04fbbc19") }
> db.demo542.insertOne({"Name":"John"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8cabdaef4dcbee04fbbc1a") }
Hiển thị tất cả:
> db.demo542.find();
Kết quả:
{ "_id" : ObjectId("5e8cabc6ef4dcbee04fbbc17"), "ListOfName" : [ "Chris", "David" ] }
{ "_id" : ObjectId("5e8cabc8ef4dcbee04fbbc18"), "ListOfName" : null }
{ "_id" : ObjectId("5e8cabd3ef4dcbee04fbbc19"), "ListOfName" : [ "David" ] }
{ "_id" : ObjectId("5e8cabdaef4dcbee04fbbc1a"), "Name" : "John" }
Pipeline aggregate kiểm tra xem "David" có trong mảng ListOfName không (xử lý null và thiếu trường):
> var id = "David";
> db.demo542.aggregate([
... {
... "$project": {
... "matched": {
... "$eq": [
... {
... "$size": {
... "$ifNull": [
... { "$setIntersection": [ "$ListOfName", [id] ] },
... []
... ]
... }
... },
... 1
... ]
... }
... }
... }
... ])
Kết quả:
{ "_id" : ObjectId("5e8cabc6ef4dcbee04fbbc17"), "matched" : true }
{ "_id" : ObjectId("5e8cabc8ef4dcbee04fbbc18"), "matched" : false }
{ "_id" : ObjectId("5e8cabd3ef4dcbee04fbbc19"), "matched" : true }
{ "_id" : ObjectId("5e8cabdaef4dcbee04fbbc1a"), "matched" : false }
Giải thích: $setIntersection trả về mảng phần tử chung. $ifNull thay mảng null bằng mảng rỗng []. $size đếm phần tử (0 hoặc 1). $eq so sánh với 1 để ra true/false.