MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Làm cách nào để nhóm các bài đăng lồng nhau với khung tổng hợp MongoDB?

Đường dẫn sau sẽ phù hợp với bạn:

var pipeline = [
    {
        "$project": {
            "title": 1, "body": 1, 
            "post_id": { "$ifNull": [ "$_post", "$_id" ] }
        }
    },  
    {
        "$group": {
            "_id": "$post_id",
            "title": { "$first": "$title" },
            "body": { "$first": "$body" },
            "comments": {
                "$push": {
                    "_id": "$_id",
                    "_post": "$post_id",
                    "body": "$body"
                }
            }
        }
    },
    {
        "$project": {
            "title": 1, "body": 1,
            "comments": {
                "$setDifference": [
                    {
                        "$map": {
                            "input": "$comments",
                            "as": "el",
                            "in": {
                                "$cond": [
                                    { "$ne": [ "$$el._id", "$$el._post" ] },
                                    "$$el",
                                    false
                                ]
                            }
                        }
                    },
                    [false]
                ]
            }
        }
    }
];

Post.aggregate(pipeline, function (err, result) {
    if (err) { /* handle error */ };
    console.log(result);
});

Đường dẫn được cấu trúc theo cách mà bước đầu tiên của bạn, $project giai đoạn toán tử, là chiếu trường post_id sẽ được sử dụng làm nhóm theo khóa trong giai đoạn tiếp theo. Vì lược đồ của bạn có thứ bậc, bạn cần trường này cho các tài liệu gốc / gốc. $ifNull toán tử sẽ hoạt động như toán tử liên kết và trả về giá trị thay thế nếu trường không tồn tại trong tài liệu.

Bước tiếp theo, $group giai đoạn đường ống cố gắng nhóm dữ liệu để xử lý chúng. $group toán tử đường ống tương tự như mệnh đề GROUP BY của SQL. Trong SQL, chúng ta không thể sử dụng GROUP BY trừ khi chúng ta sử dụng bất kỳ hàm tổng hợp nào. Theo cách tương tự, chúng ta cũng phải sử dụng một hàm tổng hợp trong MongoDB. Trong trường hợp này, bạn cần $push toán tử để tạo mảng nhận xét. Các trường khác sau đó được tích lũy bằng cách sử dụng $first nhà điều hành.

Bước cuối cùng liên quan đến việc điều chỉnh mảng nhận xét để bạn xóa tài liệu có chi tiết bài đăng, điều này chắc chắn không thuộc loại nhận xét. Điều này được thực hiện thông qua $setDifference $map các toán tử. $map về bản chất, toán tử tạo ra một trường mảng mới chứa các giá trị là kết quả của logic được đánh giá trong biểu thức con cho mỗi phần tử của mảng. $setDifference sau đó toán tử trả về một tập hợp với các phần tử xuất hiện trong tập hợp đầu tiên nhưng không xuất hiện trong tập hợp thứ hai; tức là thực hiện một phần bù tương đối của tập hợp thứ hai so với tập hợp đầu tiên. Trong trường hợp này, nó sẽ trả về comments cuối cùng mảng có các phần tử không liên quan đến tài liệu mẹ qua _id tài sản.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách sử dụng các biến trong hàm bản đồ MongoDB Map-Reduce

  2. MongoDB:Khóa và mở khóa bộ sưu tập theo cách thủ công

  3. Công tắc MongoDB $

  4. Node.js, MongoDB - Chèn / cập nhật nhiều tài liệu và gửi một phản hồi duy nhất

  5. đếm trường tài liệu con và tổng số tiền trong mongodb