Khóa học thực chiến

[Mongodb] Nhờ giúp đỡ về câu query và sự khác nhau giữa Embedded Document và References Document



  • Chào mọi người, chúc mọi người cuối tuần vui vẻ.
    Mình có một vấn đề về query data trong mongodb, nhờ mọi người giúp đỡ. Chân thành cảm ơn.
    Mình có database như sau:
    // Activity
    {
    "__v": 0,
    "_id": { "$oid": "551ecdc03ee254bc0b9eef47" },
    "site": { "$oid": "5516b924994330f404694a73" },
    delete: false
    }

    // Site
    {
    "__v": 0,
    "_id": { "$oid": "5516b924994330f404694a73" },
    "managers": [ '1', '2' ] ,
    "name": "Site1",
    delete: false
    }

    Mình muốn query Activity, với điều kiện managers của Site bằng 1 array cho trước. Vd:
    Activity.find({ 'site.managers': [ '1', '2' ] });
    Đúng ra kết quả phải là 1 record, nhưng đằng này nó trả về rỗng.

    Mình tìm hiểu thì cách ghi 'site.managers' chỉ chạy đúng khi Subdocument là Embedded, còn Ref thì không thể query được.
    Mình cũng muốn biết sự khác nhau giữa Embedded Document và References Document là những gì.
    Mọi người ai đã gặp vấn đề này rồi thì giúp mình nhé.
    Chân thành cảm ơn.



  • $in thì phải



  • @Acenter-Ha Thử dùng $lookup xem bạn:
    Mongoose:

    Activity.find().populate({
      "path": "site",
      "match": { "managers": ['1', '2'] }
    })
    

    Native Môngo:

    db.activity.aggregate([
       {
         $lookup:
           {
             from: "site",
             localField: "site",
             foreignField: "_id",
             as: "site"
           }
      },
     {
      $match: {"site.managers": ["1", "2"]}
     }
    ])
    


  • @Kha-Pham $in thì là kiểu query trong 1 array cho trước. Bạn trên là muốn query kiểu join. Nhưng mà không ibeets bạn join stie chỉ 1 object như vậy thì đâu có 1 - 1 nhỉ. Vậy thì chỉ cần id thôi chứ cần gì managers ta.



  • Ý mà query ngược lại cũng dễ hơn nè:

    Site.find({"managers": ["1", "2"]}).populate("Activity")
    

    Nhưng cái này phải set ref ở bên activity =)).



  • @Nguyen-Hien mình thường dùng aggregate cho các truy vấn join hoặc các truy vấn đồi hỏi nhiều thứ.



  • @Kha-Pham Uh. Đúng rồi. Nhưng mà mongo thì có thể query riêng ra cũng k sao đâu. Còn bạn trên thì đang muốn query 1 bản từ data 1 bản khác thì join thôi.



  • @Nguyen-Hien Cảm ơn bạn đã reply.
    Ý đồ của mình là lấy giữ liệu của bảng A bằng điều kiện từ dữ liệu của bảng B.
    Ví dụ này cho dễ hiểu:
    Mình có Schema Post có ref đến User. User có field roles phân quyền admin và member.
    Trường hợp mình muốn tìm tất cả các bài Post của các Admin, thì nó giống với ví dụ ở trên.
    Mình cũng thử aggregate rồi nhưng vẫn không trả về kết quả đúng.
    Mongoose của mình version 4.13.14, ko biết là có bị cũ ko.



  • @Acenter-Ha Bạn post chỗ bạn query lên cho mình xem với.


Log in to reply