Hướng dẫn mongodb lookup examples - các ví dụ về tra cứu mongodb

Lời nói đầu: Mới cho đường ống tổng hợp? Kiểm tra lời giải thích 5 phút của chúng tôi trước khi lặn vào các ví dụ về tra cứu $ này .... New to the aggregation pipeline? Check out our 5 minute explanation before diving into these $lookup examples....

Ngoài ra, hãy chắc chắn để hiểu lập chỉ mục và ý nghĩa hiệu suất của đó trước khi xem xét các ví dụ này ...

$ Tra cứu cho phép bạn thực hiện các tham gia trên các bộ sưu tập trong cùng một cơ sở dữ liệu. $ Tra cứu hoạt động bằng cách trả lại các tài liệu từ bộ sưu tập "được tham gia" dưới dạng một phần phụ của bộ sưu tập gốc.

$ Tra cứu hỗ trợ cả hai trận đấu bình đẳng cơ bản cũng như các phần phụ không tương thích. Chúng tôi sẽ cung cấp một ví dụ về từng kịch bản.

Các ví dụ dựa trên dữ liệu mẫu này ...

Bộ sưu tập bài

{
    "title" : "my first post",
    "author" : "Jim",
    "likes" : 5
},
{
    "title" : "my second post",
    "author" : "Jim",
    "likes" : 2
},
{
    "title" : "hello world",
    "author" : "Joe",
    "likes" : 3
}

Bộ sưu tập bình luận

{
    "postTitle" : "my first post",
    "comment" : "great read",
    "likes" : 3
},
{
    "postTitle" : "my second post",
    "comment" : "good info",
    "likes" : 0
},
{
    "postTitle" : "my second post",
    "comment" : "i liked this post",
    "likes" : 12
},
{
    "postTitle" : "hello world",
    "comment" : "not my favorite",
    "likes" : 8
},
{
    "postTitle" : "my last post",
    "comment" : null,
    "likes" : 0
}

Lưu ý cách chúng tôi có hai bài viết và nhận xét của bộ sưu tập. Trường Posttitle trong bộ sưu tập bình luận tương ứng với trường tiêu đề trong bộ sưu tập bài viết.

Cả bình luận và bài viết đều có thích.

$ Tra cứu Ví dụ: Phù hợp với bình đẳng

db.posts.aggregate([
    { $lookup:
        {
           from: "comments",
           localField: "title",
           foreignField: "postTitle",
           as: "comments"
        }
    }
])

Lưu ý cách $ Tra cứu lấy một tài liệu với các trường sau:

  • Từ: bộ sưu tập chúng tôi muốn tham gia với the collection we want to join with
  • LocalField: Trường chúng tôi muốn tham gia vào bộ sưu tập cục bộ (bộ sưu tập chúng tôi đang chạy truy vấn trên) the field we want to join by in the local collection (the collection we are running the query on)
  • Trường nước ngoài: Lĩnh vực chúng tôi muốn tham gia vào Bộ sưu tập nước ngoài (bộ sưu tập chúng tôi muốn tham gia) the field we want to join by in the foreign collection (the collection we want to join with)
  • AS: Tên của mảng đầu ra cho kết quả the name of the output array for the results

Truy vấn này trả về sau ..

{
    "title" : "my first post",
    "author" : "Jim",
    "likes" : 5,
    "comments" : [
        {
            "postTitle" : "my first post",
            "comment" : "great read",
            "likes" : 3
        }
    ]
},
{
    "title" : "my second post",
    "author" : "Jim",
    "likes" : 2,
    "comments" : [
        {
            "postTitle" : "my second post",
            "comment" : "good info",
            "likes" : 0
        },
        {
            "postTitle" : "my second post",
            "comment" : "i liked this post",
            "likes" : 12
        }
    ]
},
{
    "title" : "hello world",
    "author" : "Joe",
    "likes" : 3,
    "comments" : [
        {
            "postTitle" : "hello world",
            "comment" : "not my favorite",
            "likes" : 8
        }
    ]
}

Lưu ý cách 3 tài liệu gốc từ bộ sưu tập bài được trả lại với một nhận xét trường bổ sung.

Đối với mỗi bài đăng, mảng bình luận mới này có tất cả các tài liệu từ bộ sưu tập bình luận có trường posttitle phù hợp với trường tiêu đề của bài đăng.

db.posts.aggregate([
 { $lookup:
     {
       from: "comments",
       let: { post_likes: "$likes", post_title: "$title"},
       pipeline: [
            { $match:
                { $expr:
                    { $and:
                        [
                           { $gt: [ "$likes", "$$post_likes"] },
                           { $eq: ["$$post_title", "$postTitle" ] }
                        ]
                    }
                }
            }
        ],
        as: "comments"
        }
 }
])

Lưu ý cách $ Tra cứu mất các trường hơi khác nhau. Cụ thể các lĩnh vực địa phương và nước ngoài đã được thay thế bằng:

  • Đặt (tùy chọn): Một biểu thức xác định các biến để sử dụng trong giai đoạn đường ống. Đây là cách bạn truy cập các trường từ bộ sưu tập đầu vào trong giai đoạn đường ống. an expression defining variables to use in the pipeline stage. This is how you access fields from the input collection in the pipeline stage.
  • Đường ống: Một đường ống tổng hợp để thực hiện trên bộ sưu tập để tham gia an aggregation pipeline to execute on the collection to join

Lưu ý cách chúng tôi xác định hai biến trong biểu thức LET. Chúng tôi xác định post_like và post_title để chúng tôi có thể tham chiếu các tài liệu đầu vào trong giai đoạn đường ống.

Đây là cách duy nhất để chúng tôi so sánh giữa các bộ sưu tập khác nhau ...

{ $gt: [ "$likes", "$$post_likes"] },
{ $eq: ["$$post_title", "$postTitle" ] }

Lưu ý cách chúng tôi sử dụng $$ để chỉ các biến chúng tôi đã xác định trong LET. Chúng tôi tham khảo các trường trong bộ sưu tập nước ngoài với một $.

Truy vấn này trả về sau ..

{
    "title" : "my first post",
    "author" : "Jim",
    "likes" : 5,
    "comments" : []
},
{
    "title" : "my second post",
    "author" : "Jim",
    "likes" : 2,
    "comments" : [
        {
            "postTitle" : "my second post",
            "comment" : "i liked this post",
            "likes" : 12
        }
    ]
},
{
    "title" : "hello world",
    "author" : "Joe",
    "likes" : 3,
    "comments" : [
        {
            "postTitle" : "hello world",
            "comment" : "not my favorite",
            "likes" : 8
        }
    ]
}

Lưu ý cách 3 tài liệu gốc từ bộ sưu tập bài được trả lại với một nhận xét trường bổ sung.

Đối với mỗi bài đăng, mảng bình luận mới này có tất cả các tài liệu từ bộ sưu tập bình luận có trường posttitle phù hợp với trường tiêu đề của bài đăng.

Lưu ý cách $ Tra cứu mất các trường hơi khác nhau. Cụ thể các lĩnh vực địa phương và nước ngoài đã được thay thế bằng:

Đặt (tùy chọn): Một biểu thức xác định các biến để sử dụng trong giai đoạn đường ống. Đây là cách bạn truy cập các trường từ bộ sưu tập đầu vào trong giai đoạn đường ống.

Đường ống: Một đường ống tổng hợp để thực hiện trên bộ sưu tập để tham gia

Lưu ý cách chúng tôi xác định hai biến trong biểu thức LET. Chúng tôi xác định post_like và post_title để chúng tôi có thể tham chiếu các tài liệu đầu vào trong giai đoạn đường ống.