Hướng dẫn can you join data in mongodb? - bạn có thể tham gia dữ liệu trong mongodb không?

Chúng tôi có thể hợp nhất/tham gia tất cả dữ liệu bên trong chỉ một bộ sưu tập có chức năng dễ dàng trong một vài dòng sử dụng bảng điều khiển máy khách MongoDB và bây giờ chúng tôi có thể thực hiện truy vấn mong muốn. Dưới một ví dụ hoàn chỉnh,

.- Các tác giả:

db.authors.insert([
    {
        _id: 'a1',
        name: { first: 'orlando', last: 'becerra' },
        age: 27
    },
    {
        _id: 'a2',
        name: { first: 'mayra', last: 'sanchez' },
        age: 21
    }
]);

.- Thể loại:

db.categories.insert([
    {
        _id: 'c1',
        name: 'sci-fi'
    },
    {
        _id: 'c2',
        name: 'romance'
    }
]);

.- Sách

db.books.insert([
    {
        _id: 'b1',
        name: 'Groovy Book',
        category: 'c1',
        authors: ['a1']
    },
    {
        _id: 'b2',
        name: 'Java Book',
        category: 'c2',
        authors: ['a1','a2']
    },
]);

.- Cho vay sách

db.lendings.insert([
    {
        _id: 'l1',
        book: 'b1',
        date: new Date('01/01/11'),
        lendingBy: 'jose'
    },
    {
        _id: 'l2',
        book: 'b1',
        date: new Date('02/02/12'),
        lendingBy: 'maria'
    }
]);

.- Phép thuật:

db.books.find().forEach(
    function (newBook) {
        newBook.category = db.categories.findOne( { "_id": newBook.category } );
        newBook.lendings = db.lendings.find( { "book": newBook._id  } ).toArray();
        newBook.authors = db.authors.find( { "_id": { $in: newBook.authors }  } ).toArray();
        db.booksReloaded.insert(newBook);
    }
);

.- Nhận dữ liệu bộ sưu tập mới:

db.booksReloaded.find().pretty()

.- Phản ứng :)

{
    "_id" : "b1",
    "name" : "Groovy Book",
    "category" : {
        "_id" : "c1",
        "name" : "sci-fi"
    },
    "authors" : [
        {
            "_id" : "a1",
            "name" : {
                "first" : "orlando",
                "last" : "becerra"
            },
            "age" : 27
        }
    ],
    "lendings" : [
        {
            "_id" : "l1",
            "book" : "b1",
            "date" : ISODate("2011-01-01T00:00:00Z"),
            "lendingBy" : "jose"
        },
        {
            "_id" : "l2",
            "book" : "b1",
            "date" : ISODate("2012-02-02T00:00:00Z"),
            "lendingBy" : "maria"
        }
    ]
}
{
    "_id" : "b2",
    "name" : "Java Book",
    "category" : {
        "_id" : "c2",
        "name" : "romance"
    },
    "authors" : [
        {
            "_id" : "a1",
            "name" : {
                "first" : "orlando",
                "last" : "becerra"
            },
            "age" : 27
        },
        {
            "_id" : "a2",
            "name" : {
                "first" : "mayra",
                "last" : "sanchez"
            },
            "age" : 21
        }
    ],
    "lendings" : [ ]
}

Tôi hy vọng dòng này có thể giúp bạn.

MongoDB là một trong những cơ sở dữ liệu phổ biến nhất cho các ứng dụng hiện đại. Nó cho phép một cách tiếp cận linh hoạt hơn đối với mô hình dữ liệu so với cơ sở dữ liệu SQL truyền thống. Các nhà phát triển có thể xây dựng các ứng dụng nhanh hơn vì tính linh hoạt này và cũng có nhiều tùy chọn triển khai, từ CUNG CẤP CLOUDB ATLAS cung cấp thông qua phiên bản cộng đồng nguồn mở.

MongoDB lưu trữ mỗi bản ghi dưới dạng tài liệu với các trường. Các trường này có thể có một loạt các loại linh hoạt và thậm chí có thể có các tài liệu khác là giá trị. Mỗi tài liệu là một phần của bộ sưu tập - hãy nghĩ về một bảng nếu bạn đến từ một mô hình quan hệ. Khi bạn đang cố gắng tạo ra một tài liệu trong một nhóm không tồn tại, MongoDB tạo ra nó một cách nhanh chóng. Không cần phải tạo một bộ sưu tập và chuẩn bị một lược đồ trước khi bạn thêm dữ liệu vào nó.

MongoDB cung cấp ngôn ngữ truy vấn MongoDB để thực hiện các hoạt động trong cơ sở dữ liệu. Khi truy xuất dữ liệu từ một bộ sưu tập các tài liệu, chúng tôi có thể tìm kiếm theo trường, áp dụng các bộ lọc và sắp xếp kết quả theo tất cả các cách mà chúng tôi mong đợi. Thêm vào đó, hầu hết các ngôn ngữ có ánh xạ liên quan đến đối tượng bản địa, chẳng hạn như Mongoose trong JavaScript và Mongoid trong Ruby.

Việc thêm thông tin liên quan từ các bộ sưu tập khác vào dữ liệu được trả về luôn luôn nhanh chóng hoặc trực quan. Hãy tưởng tượng chúng tôi có hai bộ sưu tập: một bộ sưu tập người dùng và một bộ sưu tập sản phẩm. Chúng tôi muốn lấy một danh sách tất cả người dùng và hiển thị danh sách các sản phẩm mà họ đã mua. Chúng tôi muốn thực hiện điều này trong một truy vấn duy nhất để đơn giản hóa mã và giảm các giao dịch dữ liệu giữa máy khách và cơ sở dữ liệu.

Chúng tôi đã làm điều này với sự tham gia bên ngoài bên trái của người dùng và các bảng sản phẩm trong cơ sở dữ liệu SQL. Tuy nhiên, MongoDB là một cơ sở dữ liệu SQL. Tuy nhiên, điều này không có nghĩa là nó không thể thực hiện tham gia dữ liệu - chúng trông hơi khác so với cơ sở dữ liệu SQL. Trong bài viết này, chúng tôi sẽ xem xét các chiến lược mà chúng tôi có thể sử dụng để tham gia dữ liệu trong MongoDB.

Tham gia dữ liệu trong MongoDB

Hãy bắt đầu bằng cách thảo luận về cách chúng ta có thể tham gia dữ liệu trong MongoDB. Có hai cách để thực hiện tham gia: sử dụng toán tử

db.categories.insert([
    {
        _id: 'c1',
        name: 'sci-fi'
    },
    {
        _id: 'c2',
        name: 'romance'
    }
]);
4 và phi chính thức. Sau đó trong bài viết này, chúng tôi cũng sẽ xem xét một số lựa chọn thay thế để thực hiện các kết nối dữ liệu.

Sử dụng toán tử tra cứu $

Bắt đầu với MongoDB phiên bản 3.2, ngôn ngữ truy vấn cơ sở dữ liệu bao gồm toán tử tra cứu $. Tra cứu mongoDB xảy ra như một giai đoạn trong một đường ống tổng hợp. Toán tử này cho phép chúng tôi tham gia hai bộ sưu tập trong cùng một cơ sở dữ liệu. Nó có hiệu quả thêm một giai đoạn khác vào quy trình truy xuất dữ liệu, tạo ra một trường mảng mới có các yếu tố là các tài liệu phù hợp từ bộ sưu tập được tham gia. Hãy để xem nó trông như thế nào:

Bắt đầu với MongoDB phiên bản 3.2, ngôn ngữ truy vấn cơ sở dữ liệu bao gồm toán tử

db.categories.insert([
    {
        _id: 'c1',
        name: 'sci-fi'
    },
    {
        _id: 'c2',
        name: 'romance'
    }
]);
4. Tra cứu mongoDB xảy ra như một giai đoạn trong một đường ống tổng hợp. Toán tử này cho phép chúng tôi tham gia hai bộ sưu tập trong cùng một cơ sở dữ liệu. Nó có hiệu quả thêm một giai đoạn khác vào quy trình truy xuất dữ liệu, tạo ra một trường mảng mới có các yếu tố là các tài liệu phù hợp từ bộ sưu tập được tham gia. Hãy để xem nó trông như thế nào:

db.users.aggregate([{$lookup: 
    {
     from: "products", 
     localField: "product_id", 
     foreignField: "_id", 
     as: "products"
    }
}])

Bạn có thể thấy rằng chúng tôi đã sử dụng toán tử

db.categories.insert([
    {
        _id: 'c1',
        name: 'sci-fi'
    },
    {
        _id: 'c2',
        name: 'romance'
    }
]);
4 trong một cuộc gọi tổng hợp đến bộ sưu tập người dùng. Nhà điều hành lấy một đối tượng tùy chọn có các giá trị điển hình cho bất kỳ ai đã làm việc với cơ sở dữ liệu SQL. Vì vậy,
db.categories.insert([
    {
        _id: 'c1',
        name: 'sci-fi'
    },
    {
        _id: 'c2',
        name: 'romance'
    }
]);
7 là tên của bộ sưu tập phải có trong cùng một cơ sở dữ liệu và
db.categories.insert([
    {
        _id: 'c1',
        name: 'sci-fi'
    },
    {
        _id: 'c2',
        name: 'romance'
    }
]);
8 là trường chúng tôi so sánh với
db.categories.insert([
    {
        _id: 'c1',
        name: 'sci-fi'
    },
    {
        _id: 'c2',
        name: 'romance'
    }
]);
9 trong cơ sở dữ liệu đích. Khi chúng tôi có tất cả các sản phẩm phù hợp, chúng tôi thêm chúng vào một mảng được đặt tên bởi tài sản.

Cách tiếp cận này tương đương với một truy vấn SQL có thể trông như thế này, sử dụng một truy vấn con:

SELECT *, products
FROM users
WHERE products in (
  SELECT *
  FROM products
  WHERE id = users.product_id
);

Hoặc như thế này, sử dụng tham gia bên trái:

SELECT *
FROM users
LEFT JOIN products
ON user.product_id = products._id

Mặc dù hoạt động này thường có thể đáp ứng nhu cầu của chúng tôi, nhà điều hành

db.categories.insert([
    {
        _id: 'c1',
        name: 'sci-fi'
    },
    {
        _id: 'c2',
        name: 'romance'
    }
]);
4 giới thiệu một số nhược điểm. Đầu tiên, nó quan trọng ở giai đoạn truy vấn của chúng tôi, chúng tôi sử dụng
db.categories.insert([
    {
        _id: 'c1',
        name: 'sci-fi'
    },
    {
        _id: 'c2',
        name: 'romance'
    }
]);
4. Nó có thể là một thách thức để xây dựng các loại, bộ lọc hoặc kết hợp phức tạp hơn trên dữ liệu của chúng tôi trong các giai đoạn sau của một đường ống tổng hợp nhiều giai đoạn. Thứ hai,
db.categories.insert([
    {
        _id: 'c1',
        name: 'sci-fi'
    },
    {
        _id: 'c2',
        name: 'romance'
    }
]);
4 là một hoạt động tương đối chậm, tăng thời gian truy vấn của chúng tôi. Mặc dù chúng tôi chỉ gửi một truy vấn duy nhất trong nội bộ, MongoDB thực hiện nhiều truy vấn để đáp ứng yêu cầu của chúng tôi.

Sử dụng sự biến đổi trong MongoDB

Thay thế cho việc sử dụng toán tử

db.categories.insert([
    {
        _id: 'c1',
        name: 'sci-fi'
    },
    {
        _id: 'c2',
        name: 'romance'
    }
]);
4, chúng tôi có thể từ chối dữ liệu của mình. Cách tiếp cận này là lợi thế nếu chúng ta thường thực hiện nhiều lần tham gia cho cùng một truy vấn. Phục biến là phổ biến trong cơ sở dữ liệu SQL. Ví dụ: chúng ta có thể tạo một bảng liền kề để lưu trữ dữ liệu đã tham gia của chúng tôi trong cơ sở dữ liệu SQL.

Phục biến là tương tự trong MongoDB, với một sự khác biệt đáng chú ý. Thay vì lưu trữ dữ liệu này dưới dạng bảng phẳng, chúng tôi có thể có các tài liệu lồng nhau đại diện cho kết quả của tất cả các lần tham gia của chúng tôi. Cách tiếp cận này tận dụng tính linh hoạt của các tài liệu phong phú của MongoDB. Và, chúng tôi tự do lưu trữ dữ liệu theo bất kỳ cách nào có ý nghĩa cho ứng dụng của chúng tôi.

Ví dụ, hãy tưởng tượng chúng tôi có các bộ sưu tập MongoDB riêng cho sản phẩm, đơn đặt hàng và khách hàng. Các tài liệu trong các bộ sưu tập này có thể trông như thế này:

Sản phẩm

db.categories.insert([
    {
        _id: 'c1',
        name: 'sci-fi'
    },
    {
        _id: 'c2',
        name: 'romance'
    }
]);
0

khách hàng

db.categories.insert([
    {
        _id: 'c1',
        name: 'sci-fi'
    },
    {
        _id: 'c2',
        name: 'romance'
    }
]);
1

Gọi món

db.categories.insert([
    {
        _id: 'c1',
        name: 'sci-fi'
    },
    {
        _id: 'c2',
        name: 'romance'
    }
]);
2

Nếu chúng tôi từ chối các tài liệu này để chúng tôi có thể truy xuất tất cả dữ liệu bằng một truy vấn duy nhất, tài liệu đặt hàng của chúng tôi trông giống như sau:

db.categories.insert([
    {
        _id: 'c1',
        name: 'sci-fi'
    },
    {
        _id: 'c2',
        name: 'romance'
    }
]);
3

Phương pháp này hoạt động trong thực tế bởi vì, trong quá trình ghi dữ liệu, chúng tôi lưu trữ tất cả dữ liệu chúng tôi cần trong tài liệu cấp cao nhất. Trong trường hợp này, chúng tôi đã hợp nhất dữ liệu sản phẩm và khách hàng vào tài liệu đặt hàng. Khi chúng tôi truy vấn thông tin bây giờ, chúng tôi sẽ hiểu ngay. Chúng tôi không cần bất kỳ truy vấn thứ cấp hoặc đại học nào để truy xuất dữ liệu của chúng tôi. Cách tiếp cận này làm tăng tốc độ và hiệu quả của các hoạt động đọc dữ liệu. Sự đánh đổi là nó yêu cầu xử lý trả trước bổ sung và tăng thời gian thực hiện cho mỗi hoạt động ghi.

Bản sao của sản phẩm và mọi người dùng mua sản phẩm đó đưa ra một thách thức bổ sung. Đối với một ứng dụng nhỏ, mức độ trùng lặp dữ liệu này không phải là một vấn đề. Đối với một ứng dụng thương mại điện tử đến doanh nghiệp, có hàng ngàn đơn đặt hàng cho mỗi khách hàng, việc sao chép dữ liệu này có thể nhanh chóng trở nên tốn kém về thời gian và lưu trữ.

Những tài liệu lồng nhau đó cũng không liên kết với nhau. Nếu có một sự thay đổi đối với một sản phẩm, chúng ta cần tìm kiếm và cập nhật mọi trường hợp sản phẩm. Điều này hiệu quả có nghĩa là chúng tôi phải kiểm tra từng tài liệu trong bộ sưu tập vì chúng tôi đã thắng trước khi thay đổi có ảnh hưởng đến nó hay không.

Giải pháp thay thế cho tham gia trong MongoDB

Cuối cùng, cơ sở dữ liệu SQL xử lý tham gia tốt hơn MongoDB. Nếu chúng ta thấy mình thường tiếp cận với

db.categories.insert([
    {
        _id: 'c1',
        name: 'sci-fi'
    },
    {
        _id: 'c2',
        name: 'romance'
    }
]);
4 hoặc một bộ dữ liệu được chuẩn hóa, chúng ta có thể tự hỏi liệu chúng ta có sử dụng công cụ phù hợp cho công việc không. Có cách nào khác để tận dụng MongoDB cho ứng dụng của chúng tôi không? Có cách nào để đạt được sự tham gia có thể phục vụ nhu cầu của chúng ta tốt hơn không?

Thay vì từ bỏ MongoDB hoàn toàn, chúng ta có thể tìm kiếm một giải pháp thay thế. Một khả năng là sử dụng giải pháp lập chỉ mục thứ cấp đồng bộ với MongoDB và được tối ưu hóa cho các phân tích. Ví dụ: chúng ta có thể sử dụng Rockset, cơ sở dữ liệu phân tích thời gian thực, để nhập trực tiếp từ các luồng thay đổi MongoDB, cho phép chúng tôi truy vấn dữ liệu của mình với các truy vấn, tổng hợp và tham gia SQL.

Sự kết luận

Chúng tôi có một loạt các tùy chọn để tạo một bộ dữ liệu được làm giàu bằng cách tham gia các yếu tố liên quan từ nhiều bộ sưu tập. Phương pháp đầu tiên là toán tử

db.categories.insert([
    {
        _id: 'c1',
        name: 'sci-fi'
    },
    {
        _id: 'c2',
        name: 'romance'
    }
]);
4. Công cụ đáng tin cậy này cho phép chúng tôi thực hiện tương đương với các kết nối bên trái trên dữ liệu MongoDB của chúng tôi. Hoặc, chúng ta có thể chuẩn bị một bộ sưu tập được chuẩn bị cho phép truy xuất nhanh các truy vấn mà chúng ta yêu cầu. Thay thế cho các tùy chọn này, chúng tôi có thể sử dụng các khả năng phân tích SQL của Rockset trên dữ liệu trong MongoDB, bất kể nó được cấu trúc như thế nào.

Nếu bạn đã thử các khả năng phân tích thời gian thực của Rockset, tại sao không đi? Nhảy qua tài liệu và tìm hiểu thêm về cách bạn có thể sử dụng Rockset với MongoDB.


Rockset là cơ sở dữ liệu phân tích thời gian thực trong đám mây cho các nhóm dữ liệu hiện đại. Nhận phân tích nhanh hơn trên dữ liệu tươi hơn, với chi phí thấp hơn, bằng cách khai thác lập chỉ mục qua quét vũ lực.

Đăng kí miễn phí

Bắt đầu với $ 300 trong các khoản tín dụng miễn phí. Không cần thẻ tín dụng.

Tại sao tham gia không được sử dụng trong MongoDB?

Kết luận là MongoDB tham gia rất giòn (khi mọi thứ thay đổi, các chương trình ứng dụng phải được mã hóa rộng rãi) và thường mang lại hiệu suất rất kém, so với postgres.

Làm cách nào để tham gia hai bảng trong MongoDB?

Để thực hiện MongoDB tham gia hai bộ sưu tập, bạn phải sử dụng toán tử tra cứu $.Nó được định nghĩa là một giai đoạn thực hiện tham gia bên ngoài bên trái với một bộ sưu tập khác và hỗ trợ lọc dữ liệu từ các tài liệu được nối.Ví dụ: nếu người dùng yêu cầu tất cả các lớp từ tất cả học sinh, thì truy vấn dưới đây có thể được viết: sinh viên.use the $lookup operator. It is defined as a stage that executes a left outer join with another collection and aids in filtering data from joined documents. For example, if a user requires all grades from all students, then the below query can be written: Students.

Chúng ta có thể tham gia 2 bộ sưu tập trong MongoDB không?

Có, bạn có thể tham gia 2 bộ sưu tập với Khung tổng hợp và $ Unionwith Giai đoạn.Dưới đây là các tài liệu có cú pháp và ví dụ, vì vậy bạn có thể kiểm tra cách thực hiện.. Here are the docs with syntax and examples, so you can check how to do it.

Bạn có thể tham gia trong NoQuery không?

Một mệnh đề tham gia được sử dụng để kết hợp các hàng từ hai hoặc nhiều bảng, dựa trên một cột liên quan giữa chúng.Các kết nối chủ yếu được sử dụng trong cơ sở dữ liệu Oracle NoQuery khi người dùng đang cố gắng trích xuất dữ liệu từ các bảng có mối quan hệ phân cấp giữa chúng.Joins are predominantly used in an Oracle NoSQL Database when a user is trying to extract data from tables that have a hierarchical relationship between them.