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

Lọc tài liệu con theo điều kiện tài liệu con trong MongoDB

Sử dụng aggregation với nhiều $unwind và $match để lọc tài liệu con lồng sâu. Tạo collection phức tạp:

> db.demo583.insert([{
...   "details1": [
...     { "details2": [ { "isMarried": true, "Name": "Chris" }, { "isMarried": true, "Name": "Bob" } ] },
...     { "details2": [ { "isMarried": false, "Name": "Chris" }, { "isMarried": true, "Name": "Mike" } ] }
...   ]
... }]);
BulkWriteResult({ "nInserted" : 1 })

Hiển thị dữ liệu:

> db.demo583.find();
{ "_id" : ObjectId("5e91d3c4fd2d90c177b5bcc1"), "details1" : [ { "details2" : [ { "isMarried" : true, "Name" : "Chris" }, { "isMarried" : true, "Name" : "Bob" } ] }, { "details2" : [ { "isMarried" : false, "Name" : "Chris" }, { "isMarried" : true, "Name" : "Mike" } ] } ] }

Pipeline lọc: isMarried=true VÀ Name="Chris" ở cấp details2:

> var q = [
...   { "$match": { "details1.details2.isMarried": true, "details1.details2.Name": "Chris" } },
...   { "$unwind": "$details1" },
...   { "$unwind": "$details1.details2" },
...   { "$match": { "details1.details2.isMarried": true, "details1.details2.Name": "Chris" } }
... ];
> db.demo583.aggregate(q).pretty();

Kết quả (chỉ giữ lại subdocument khớp):

{ "_id" : ObjectId("5e91d3c4fd2d90c177b5bcc1"), "details1" : { "details2" : { "isMarried" : true, "Name" : "Chris" } } }

Quy trình:

  1. $match đầu: Lọc nhanh tài liệu gốc có chứa giá trị mục tiêu
  2. $unwind details1: Phân tách mảng cấp 1
  3. $unwind details2: Phân tách mảng cấp 2
  4. $match cuối: Lọc chính xác subdocument cấp sâu nhất