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

Thiết lập điều kiện lọc cho mảng lồng nhau trong MongoDB

Sử dụng $filter và $cond trong Aggregation

Toán tử $filter chọn một tập con của mảng dựa trên điều kiện. Kết hợp với $map và $anyElementTrue để lọc mảng lồng nhau phức tạp.

Dữ liệu mẫu (3 cấp lồng nhau)

> db.demo725.insertOne({
  details: {
    userMessages: [
      { Messages: [ { Message: "Hello" }, { Message: "How" }, { Message: "are" } ] },
      { Messages: [ { Message: "Good" }, { Message: "Bye" } ] },
      { Messages: [ { Message: "Hello" }, { Message: "Bye" } ] }
    ]
  }
});

Truy vấn lọc: giữ lại các nhóm Messages chứa "Hello"

db.demo725.aggregate([
  {
    $addFields: {
      "details.userMessages": {
        $filter: {
          input: "$details.userMessages",
          as: "out",
          cond: {
            $anyElementTrue: {
              $map: {
                input: "$$out.Messages",
                in: { $gte: [ { $indexOfBytes: [ "$$this.Message", "Hello" ] }, 0 ] }
              }
            }
          }
        }
      }
    }
  }
]).pretty()

Kết quả

{
  "_id": ObjectId("5eab16cd43417811278f5893"),
  "details": {
    "userMessages": [
      { "Messages": [ { "Message": "Hello" }, { "Message": "How" }, { "Message": "are" } ] },
      { "Messages": [ { "Message": "Hello" }, { "Message": "Bye" } ] }
    ]
  }
}

Chỉ các phần tử mảng chứa tin nhắn "Hello" được giữ lại.