Khớp trong tra cứu mongodb

Chào mọi người. Mình có 1 app đang sử dụng mongodb. Do mới xúc động nên có vấn đề mình gặp phải cần mọi người giúp đỡ

Mình có 3 model liên quan cụ thể các trường bên dưới. Từ Mô hình Đánh giá, mình muốn lấy toàn bộ đánh giá của Sách. định dạng api bộ định tuyến. tên miền/book_id/đánh giá. Mỗi bài đánh giá sẽ có bình luận nên luôn nhận được bình luận của bài đánh giá tương ứng (và thông tin tác giả của bình luận đó). Trong từng bình luận có trường user_id. Ở đây mình sử dụng các bảng riêng biệt

Lúc trước mình dùng foEarch lấy từng ID rồi truy vấn để lấy thông tin. Nhưng thấy nó mất thời gian Load. Sau đó thì tìm hiểu đc cái lookup and populate này

Mình sử dụng câu hỏi như thế này ở Model review

async testLookup(book_id, limit, page){
return await Review.aggregate([
		{ $match: { "book_id": new mongoose.Types.ObjectId(book_id)} },
        { $lookup: {
            from: 'comments',
            localField: '_id',
            foreignField: 'review_id',
            as: 'comments'
        }},
   ]);
} 

Kết quả sẽ ra như thế này. Mình muốn ở cái user_id sẽ hiển thị thông tin đối tượng User đó luôn. Kiểu như bình thường sử dụng dân cư thì sẽ là Bình luận. user_id

( "user_id": {
               "_id": "5b4f090bbcb0521b24759a9c",
               "email": "",
               "is_admin": false,
               "username": "hhhhh"
           }
)

Models information

Kiểm tra lại

var mongoose = require('mongoose'), Schema = mongoose.Schema
, ObjectId = Schema.ObjectId;
var ReviewSchema = new mongoose.Schema({
  user_id: { type: ObjectId, ref: 'User' },
  book_id: { type: ObjectId },
  star: { type: Number, default: 0 },
  content: String
},
{
    timestamps: true   
}
);

Bình luận

var mongoose = require('mongoose'),
 Schema = mongoose.Schema,
 ObjectId = Schema.ObjectId;
var CommentSchema = new mongoose.Schema({
  user_id: { type: ObjectId, ref: 'User' },
  review_id: { type: ObjectId, ref: 'Review' },
  content: String
});

Trang chủ Tài liệu Hướng dẫn sử dụng MongoDB

Trên trang này

  • Sự định nghĩa
  • cú pháp
  • Kết hợp bình đẳng với một điều kiện tham gia duy nhất
  • Tham gia Điều kiện và Truy vấn con trên Bộ sưu tập đã tham gia
  • Các truy vấn con tương quan sử dụng cú pháp ngắn gọn
  • Hành vi
  • Lượt xem và đối chiếu
  • Những hạn chế
  • Hỗ trợ tìm kiếm bản đồ
  • Bộ sưu tập được chia nhỏ
  • Công cụ thực thi truy vấn dựa trên vị trí
  • ví dụ
  • Thực hiện đẳng thức đơn Tham gia với
    ( "user_id": {
                   "_id": "5b4f090bbcb0521b24759a9c",
                   "email": "",
                   "is_admin": false,
                   "username": "hhhhh"
               }
    )
    
    9
  • Sử dụng
    ( "user_id": {
                   "_id": "5b4f090bbcb0521b24759a9c",
                   "email": "",
                   "is_admin": false,
                   "username": "hhhhh"
               }
    )
    
    9 với một Mảng
  • Sử dụng
    ( "user_id": {
                   "_id": "5b4f090bbcb0521b24759a9c",
                   "email": "",
                   "is_admin": false,
                   "username": "hhhhh"
               }
    )
    
    9 với
    ( "user_id": {
                   "_id": "5b4f090bbcb0521b24759a9c",
                   "email": "",
                   "is_admin": false,
                   "username": "hhhhh"
               }
    )
    
    0
  • Thực hiện nhiều phép nối và truy vấn con tương quan với
    ( "user_id": {
                   "_id": "5b4f090bbcb0521b24759a9c",
                   "email": "",
                   "is_admin": false,
                   "username": "hhhhh"
               }
    )
    
    9
  • Thực hiện một truy vấn con không tương quan với
    ( "user_id": {
                   "_id": "5b4f090bbcb0521b24759a9c",
                   "email": "",
                   "is_admin": false,
                   "username": "hhhhh"
               }
    )
    
    9
  • Thực hiện một Truy vấn con tương quan ngắn gọn với
    ( "user_id": {
                   "_id": "5b4f090bbcb0521b24759a9c",
                   "email": "",
                   "is_admin": false,
                   "username": "hhhhh"
               }
    )
    
    9
( "user_id": {
               "_id": "5b4f090bbcb0521b24759a9c",
               "email": "",
               "is_admin": false,
               "username": "hhhhh"
           }
)
9

Đã thay đổi trong phiên bản 5. 1

Thực hiện liên kết bên ngoài bên trái với một tập hợp trong cùng một cơ sở dữ liệu để lọc các tài liệu từ tập hợp "đã tham gia" để xử lý. Giai đoạn

( "user_id": {
               "_id": "5b4f090bbcb0521b24759a9c",
               "email": "",
               "is_admin": false,
               "username": "hhhhh"
           }
)
9 thêm một trường mảng mới vào mỗi tài liệu đầu vào. Trường mảng mới chứa các tài liệu phù hợp từ bộ sưu tập "đã tham gia". Giai đoạn
( "user_id": {
               "_id": "5b4f090bbcb0521b24759a9c",
               "email": "",
               "is_admin": false,
               "username": "hhhhh"
           }
)
9
chuyển các tài liệu đã định hình lại này sang giai đoạn tiếp theo.

Bắt đầu từ MongoDB 5. 1,

( "user_id": {
               "_id": "5b4f090bbcb0521b24759a9c",
               "email": "",
               "is_admin": false,
               "username": "hhhhh"
           }
)
9 hoạt động trên các bộ sưu tập được phân đoạn.

Để kết hợp các phần tử từ hai bộ sưu tập khác nhau, hãy sử dụng giai đoạn đường ống

( "user_id": {
               "_id": "5b4f090bbcb0521b24759a9c",
               "email": "",
               "is_admin": false,
               "username": "hhhhh"
           }
)
8

Giai đoạn

( "user_id": {
               "_id": "5b4f090bbcb0521b24759a9c",
               "email": "",
               "is_admin": false,
               "username": "hhhhh"
           }
)
9 có các cú pháp sau.

Để thực hiện đối sánh bằng giữa một trường từ các tài liệu đầu vào với một trường từ các tài liệu của bộ sưu tập "đã tham gia",

( "user_id": {
               "_id": "5b4f090bbcb0521b24759a9c",
               "email": "",
               "is_admin": false,
               "username": "hhhhh"
           }
)
9 .

{   $lookup:     {       from: ,       localField: ,       foreignField: ,       as:      }}

The

( "user_id": {
               "_id": "5b4f090bbcb0521b24759a9c",
               "email": "",
               "is_admin": false,
               "username": "hhhhh"
           }
)
9 lấy tài liệu có các trường này.

Đồng ruộng

Sự mô tả

từ

Chỉ định bộ sưu tập trong cùng một cơ sở dữ liệu để thực hiện phép nối với

Bắt đầu từ MongoDB 5. 1, bộ sưu tập được chỉ định trong tham số

var mongoose = require('mongoose'), Schema = mongoose.Schema
, ObjectId = Schema.ObjectId;
var ReviewSchema = new mongoose.Schema({
  user_id: { type: ObjectId, ref: 'User' },
  book_id: { type: ObjectId },
  star: { type: Number, default: 0 },
  content: String
},
{
    timestamps: true   
}
);
2 có thể được chia nhỏ

trường địa phương

Chỉ định trường từ đầu vào tài liệu đến giai đoạn

( "user_id": {
               "_id": "5b4f090bbcb0521b24759a9c",
               "email": "",
               "is_admin": false,
               "username": "hhhhh"
           }
)
9 . ______19 thực hiện đối sánh bằng trên
var mongoose = require('mongoose'), Schema = mongoose.Schema
, ObjectId = Schema.ObjectId;
var ReviewSchema = new mongoose.Schema({
  user_id: { type: ObjectId, ref: 'User' },
  book_id: { type: ObjectId },
  star: { type: Number, default: 0 },
  content: String
},
{
    timestamps: true   
}
);
5 với
var mongoose = require('mongoose'), Schema = mongoose.Schema
, ObjectId = Schema.ObjectId;
var ReviewSchema = new mongoose.Schema({
  user_id: { type: ObjectId, ref: 'User' },
  book_id: { type: ObjectId },
  star: { type: Number, default: 0 },
  content: String
},
{
    timestamps: true   
}
);
6 từ các tài liệu của bộ sưu tập
var mongoose = require('mongoose'), Schema = mongoose.Schema
, ObjectId = Schema.ObjectId;
var ReviewSchema = new mongoose.Schema({
  user_id: { type: ObjectId, ref: 'User' },
  book_id: { type: ObjectId },
  star: { type: Number, default: 0 },
  content: String
},
{
    timestamps: true   
}
);
2. Nếu tài liệu đầu vào không chứa
var mongoose = require('mongoose'), Schema = mongoose.Schema
, ObjectId = Schema.ObjectId;
var ReviewSchema = new mongoose.Schema({
  user_id: { type: ObjectId, ref: 'User' },
  book_id: { type: ObjectId },
  star: { type: Number, default: 0 },
  content: String
},
{
    timestamps: true   
}
);
5, thì
( "user_id": {
               "_id": "5b4f090bbcb0521b24759a9c",
               "email": "",
               "is_admin": false,
               "username": "hhhhh"
           }
)
9
coi trường này có giá trị là
var mongoose = require('mongoose'),
 Schema = mongoose.Schema,
 ObjectId = Schema.ObjectId;
var CommentSchema = new mongoose.Schema({
  user_id: { type: ObjectId, ref: 'User' },
  review_id: { type: ObjectId, ref: 'Review' },
  content: String
});
0 cho mục đích đối sánh.

vùng ngoại quốc

Chỉ định trường từ các tài liệu trong bộ sưu tập

var mongoose = require('mongoose'), Schema = mongoose.Schema
, ObjectId = Schema.ObjectId;
var ReviewSchema = new mongoose.Schema({
  user_id: { type: ObjectId, ref: 'User' },
  book_id: { type: ObjectId },
  star: { type: Number, default: 0 },
  content: String
},
{
    timestamps: true   
}
);
2. ______19 thực hiện đối sánh bằng trên
var mongoose = require('mongoose'), Schema = mongoose.Schema
, ObjectId = Schema.ObjectId;
var ReviewSchema = new mongoose.Schema({
  user_id: { type: ObjectId, ref: 'User' },
  book_id: { type: ObjectId },
  star: { type: Number, default: 0 },
  content: String
},
{
    timestamps: true   
}
);
6 với
var mongoose = require('mongoose'), Schema = mongoose.Schema
, ObjectId = Schema.ObjectId;
var ReviewSchema = new mongoose.Schema({
  user_id: { type: ObjectId, ref: 'User' },
  book_id: { type: ObjectId },
  star: { type: Number, default: 0 },
  content: String
},
{
    timestamps: true   
}
);
5 từ các tài liệu đầu vào. Nếu một tài liệu trong bộ sưu tập
var mongoose = require('mongoose'), Schema = mongoose.Schema
, ObjectId = Schema.ObjectId;
var ReviewSchema = new mongoose.Schema({
  user_id: { type: ObjectId, ref: 'User' },
  book_id: { type: ObjectId },
  star: { type: Number, default: 0 },
  content: String
},
{
    timestamps: true   
}
);
2 không chứa
var mongoose = require('mongoose'), Schema = mongoose.Schema
, ObjectId = Schema.ObjectId;
var ReviewSchema = new mongoose.Schema({
  user_id: { type: ObjectId, ref: 'User' },
  book_id: { type: ObjectId },
  star: { type: Number, default: 0 },
  content: String
},
{
    timestamps: true   
}
);
6, thì
( "user_id": {
               "_id": "5b4f090bbcb0521b24759a9c",
               "email": "",
               "is_admin": false,
               "username": "hhhhh"
           }
)
9
coi giá trị là
var mongoose = require('mongoose'),
 Schema = mongoose.Schema,
 ObjectId = Schema.ObjectId;
var CommentSchema = new mongoose.Schema({
  user_id: { type: ObjectId, ref: 'User' },
  review_id: { type: ObjectId, ref: 'Review' },
  content: String
});
0 cho các mục đích khớp.

như

Chỉ định tên của trường mảng mới để thêm vào các tài liệu đã tham gia. Trường mảng mới chứa các tài liệu phù hợp từ bộ sưu tập đã tham gia. Nếu tên được chỉ định đã tồn tại trong tài liệu đã tham gia, trường hiện có sẽ bị ghi đè