Vietnam

    Nodejs.vn

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Popular
    • Tags
    • Groups
    • Search

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

    Hỏi Đáp
    0
    9
    738
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Acenter Ha
      Acenter Ha last edited by

      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.

      Nguyen Hien 1 Reply Last reply Reply Quote 0
      • Kha Pham
        Kha Pham last edited by

        $in thì phải

        Đam mê công nghệ
        Không biết nhiều nhưng cũng muốn đóng góp

        Nguyen Hien 1 Reply Last reply Reply Quote 0
        • Nguyen Hien
          Nguyen Hien @Acenter Ha last edited by

          @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"]}
           }
          ])
          

          Sent from Rodgers Zone!!!

          1 Reply Last reply Reply Quote 0
          • Nguyen Hien
            Nguyen Hien @Kha Pham last edited by

            @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.

            Sent from Rodgers Zone!!!

            Kha Pham Acenter Ha 2 Replies Last reply Reply Quote 1
            • Nguyen Hien
              Nguyen Hien last edited by

              Ý 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 =)).

              Sent from Rodgers Zone!!!

              1 Reply Last reply Reply Quote 0
              • Kha Pham
                Kha Pham @Nguyen Hien last edited by Kha Pham

                @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ứ.

                Đam mê công nghệ
                Không biết nhiều nhưng cũng muốn đóng góp

                Nguyen Hien 1 Reply Last reply Reply Quote 0
                • Nguyen Hien
                  Nguyen Hien @Kha Pham last edited by

                  @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.

                  Sent from Rodgers Zone!!!

                  1 Reply Last reply Reply Quote 1
                  • Acenter Ha
                    Acenter Ha @Nguyen Hien last edited by

                    @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.

                    Nguyen Hien 1 Reply Last reply Reply Quote 0
                    • Nguyen Hien
                      Nguyen Hien @Acenter Ha last edited by

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

                      Sent from Rodgers Zone!!!

                      1 Reply Last reply Reply Quote 0
                      • First post
                        Last post