Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Thêm trường boolean true khi giá trị cụ thể nằm trong mảng, ngược lại false

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.