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

Thực hiện các phép nối trong mongodb với ba bộ sưu tập?

Được rồi, có vẻ như bạn đang gặp một loạt vấn đề. Tôi sẽ cố gắng tổng hợp chúng lại.

Vấn đề 1:mã tổng hợp bạn đã cung cấp không biên dịch được.

db.user_movies.aggregate(
{$match : {mobile_no : mobile_no}},
{$unwind: "$movies" },
{$lookup: {from: "movies",localField: "movies",foreignField: "movie_id",as: "bmarks"}},
{$unwind : "$bmarks"},
{$match : {"bmarks.active": 1}},
{$group : { _id : "$_id", movies : {$push : "$bmarks"}, movie_ids: {$push : "$bmarks.movie_id"}}},
{$lookup: {from: "movie_comments", localField: "",foreignField: "movie_id",as: "comments"}},
{$unwind : "$comments"},
{$sort: {time_posted: -1}},
{$group: {_id: '$_id', comments : {$push : "$comments"}}},

Khắc phục:

db.user_movies.aggregate([
{$match : {mobile_no : mobile_no}},
{$unwind: "$movies" },
{$lookup: {from: "movies",localField: "movies",foreignField: "movie_id",as: "bmarks"}},
{$unwind : "$bmarks"},
{$match : {"bmarks.active": 1}},
{$group : { _id : "$_id", movies : {$push : "$bmarks"}, movie_ids: {$push : "$bmarks.movie_id"}}},
{$lookup: {from: "movie_comments", localField: "",foreignField: "movie_id",as: "comments"}},
{$unwind : "$comments"},
{$sort: {time_posted: -1}},
{$group: {_id: '$_id', comments : {$push : "$comments"}}}])

Bây giờ, giả sử bạn đang sử dụng cùng một dữ liệu mà bạn đã cung cấp.

Sự cố 2:{$match : {"bmarks.active": 1}} không khớp với bất kỳ mục nhập nào.

Khắc phục:{$match : {"bmarks.active": 0}}

Vấn đề 3:Không có trường tra cứu nào được xác định {$lookup: {from: "movie_comments", localField: "",foreignField: "movie_id",as: "comments"}}

Khắc phục:{$lookup: {from: "movie_comments", localField: "movie_ids",foreignField: "movie_id",as: "comments"}}

Vấn đề 4:Không có giai đoạn thư giãn cho movie_ids để tra cứu trước

Khắc phục:{$unwind : "$movie_ids"}

Sự cố 5:Không có trường đăng thời gian nào {$sort: {time_posted: -1}}

Khắc phục:bao gồm trường trước khi sắp xếp

Vì vậy, để tổng hợp mọi thứ lại với nhau, bạn cần tổng hợp để trông giống như cái gì đó bên dưới để trích xuất các nhận xét cho mỗi bộ phim.

db.user_movies.aggregate([
{$match : {mobile_no : mobile_no}},
{$unwind: "$movies"},
{$lookup: {from: "movies",localField: "movies",foreignField: "movie_id",as: "bmarks"}},
{$unwind : "$bmarks"},
{$match : {"bmarks.active": 0}},
{$group : { _id : "$_id", movies : {$push : "$bmarks"}, movie_ids: {$push : "$bmarks.movie_id"}}},
{$unwind : "$movie_ids"},
{$lookup: {from: "movie_comments", localField: "movie_ids",foreignField: "movie_id",as: "comments"}},
{$unwind : "$comments"},
{$group: {_id: '$_id', comments : {$push : "$comments"}}}])

Đầu ra mẫu

{
    "_id": ObjectId("5834ecf7432d92675bde9d83"),
    "comments": [{
        "_id": ObjectId("583d96d7e35f6e9c53c9e894"),
        "movie_id": "dallas00",
        "comment": "what a great movie."
    }, {
        "_id": ObjectId("583d96d7e35f6e9c53c9e895"),
        "movie_id": "dallas00",
        "comment": "awesome movie."
    }]
}

Cập nhật:

db.user_movies.aggregate([
{$match : {mobile_no : mobile_no}},
{$unwind: {path: "$movies", includeArrayIndex: "moviePosition"}},
{$sort :  {moviePosition:1}},
{$lookup: {from: "movies",localField: "movies",foreignField: "movie_id",as: "bmarks"}},
{$unwind :"$bmarks"},
{$group : {_id : "$_id", movies : {$push : {movie_name:"$bmarks.movie_name", movie_id:"$bmarks.movie_id"} }}},
{$unwind : "$movies"},
{$lookup: {from: "movie_comments", localField: "movies.movie_id",foreignField: "movie_id",as: "comments"}},
{$unwind : "$comments"},
{$group:  {_id: "$movies.movie_id", movie_name: {$first:"$movies.movie_name"}, comments : {$push : {comment:"$comments.comment", time_posted:"$comments.time_posted"}}}},
{$sort :  {time_posted:-1}},
{$project:{_id:0, movie_id:"$_id", movie_name:1, comments: "$comments.comment"}}
]).pretty();



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. không thành công với lỗi 10068:toán tử không hợp lệ:$ oid

  2. trích xuất giá trị mảng con trong mongodb

  3. Không tìm thấy lớp 'MongoDB \ Client', đã cài đặt phần mở rộng mongodb

  4. Nhập kiểu dữ liệu ngày bằng mongoimport

  5. Mongoose trả về dữ liệu bên trong đối tượng _doc