Tôi có một bộ sưu tập câu hỏi với _id và tên và các trường khác [. ] và bộ sưu tập bài kiểm tra với _id, tên và mảng câu hỏi
Tôi đang cố gắng lấy tất cả các câu hỏi với các trường của chúng và thêm một trường "usedIn" để đếm số lượng bài kiểm tra có các câu hỏi cụ thể trong đó
questions = await Question.aggregate[[
/*{
"$match": {
params
}
},*/
{
"$lookup": {
"from": "tests",
"let": {"questionId": "$_id"},
pipeline: [
{
"$match": {
"$expr": {
"$in": ["$$questionId", "$questions"],
},
},
},
],
as: "tests"
}
},
{
"$addFields": {
"usedIn": {
"$size": "tests"
}
}
},
{
"$project": fieldsObject
},
]]
Mã này mang lại cho tôi lỗi này
Lỗi. Không thể tối ưu hóa đường ống. gây ra bởi. Đối số cho $size phải là một mảng, nhưng là kiểu. chuỗi
Mối quan hệ là kết nối giữa hai mô hình trong lược đồ Prisma. Ví dụ: có mối quan hệ một-nhiều giữa
3 và
author User @relation[fields: [authorId], references: [id]]
4 vì một người dùng có thể có nhiều bài đăng trên blog
author User @relation[fields: [authorId], references: [id]]
Lược đồ Prisma sau đây xác định mối quan hệ một-nhiều giữa các mô hình
3 và
author User @relation[fields: [authorId], references: [id]]
4. Các trường liên quan đến việc xác định mối quan hệ được tô sáng
author User @relation[fields: [authorId], references: [id]]
Cơ sở dữ liệu quan hệ
MongoDB
model User {
id Int @id @default[autoincrement[]]
posts Post[]
}
model Post {
id Int @id @default[autoincrement[]]
author User @relation[fields: [authorId], references: [id]]
authorId Int // relation scalar field [used in the `@relation` attribute above]
}
Ở cấp độ Prisma, mối quan hệ
3 /
author User @relation[fields: [authorId], references: [id]]
4 được tạo thành từ
author User @relation[fields: [authorId], references: [id]]
- Hai trường quan hệ.
9 và
author User @relation[fields: [authorId], references: [id]]
0. Các trường quan hệ xác định các kết nối giữa các mô hình ở cấp độ Prisma và không tồn tại trong cơ sở dữ liệu. Các trường này được sử dụng để tạo Máy khách Prisma
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
- Trường
1 vô hướng, được tham chiếu bởi thuộc tính
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
2. Trường này tồn tại trong cơ sở dữ liệu - đó là khóa ngoại kết nối
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
4 và
author User @relation[fields: [authorId], references: [id]]
3
author User @relation[fields: [authorId], references: [id]]
Ở cấp độ Prisma, kết nối giữa hai mô hình luôn được biểu thị bằng một trường quan hệ ở mỗi bên của quan hệ
Quan hệ trong cơ sở dữ liệu
Cơ sở dữ liệu quan hệ
Sơ đồ mối quan hệ thực thể sau đây xác định cùng một mối quan hệ một-nhiều giữa các bảng
3 và
author User @relation[fields: [authorId], references: [id]]
4 trong cơ sở dữ liệu quan hệ
author User @relation[fields: [authorId], references: [id]]
Trong SQL, bạn sử dụng khóa ngoại để tạo mối quan hệ giữa hai bảng. Khóa ngoại được lưu trữ ở một bên của mối quan hệ. Ví dụ của chúng tôi được tạo thành từ
- Một cột khóa ngoại trong bảng
4 có tên là
author User @relation[fields: [authorId], references: [id]]
1
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
- Một cột khóa chính trong bảng
3 có tên là
author User @relation[fields: [authorId], references: [id]]
90. Cột
author User @relation[fields: [authorId], references: [id]]
1 trong bảng
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
4 tham chiếu cột
author User @relation[fields: [authorId], references: [id]]
90 trong bảng
author User @relation[fields: [authorId], references: [id]]
3
author User @relation[fields: [authorId], references: [id]]
Trong lược đồ Prisma, mối quan hệ khóa ngoại/khóa chính được biểu diễn bằng thuộc tính
2 trên trường
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
9
author User @relation[fields: [authorId], references: [id]]
author User @relation[fields: [authorId], references: [id]]
Ghi chú. Các mối quan hệ trong lược đồ Prisma biểu thị các mối quan hệ tồn tại giữa các bảng trong cơ sở dữ liệu. Nếu mối quan hệ không tồn tại trong cơ sở dữ liệu, thì nó không tồn tại trong lược đồ Prisma
MongoDB
Đối với MongoDB, Prisma hiện đang sử dụng thiết kế mô hình dữ liệu được chuẩn hóa, có nghĩa là các tài liệu tham chiếu lẫn nhau bằng ID theo cách tương tự với cơ sở dữ liệu quan hệ
Tài liệu sau đại diện cho một
3 [trong bộ sưu tập
author User @relation[fields: [authorId], references: [id]]
3]
author User @relation[fields: [authorId], references: [id]]
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
Danh sách các tài liệu
4 sau đây [trong bộ sưu tập
author User @relation[fields: [authorId], references: [id]]
4] mỗi tài liệu có một trường
author User @relation[fields: [authorId], references: [id]]
21 tham chiếu đến cùng một người dùng
author User @relation[fields: [authorId], references: [id]]
9
author User @relation[fields: [authorId], references: [id]]
Cấu trúc dữ liệu này thể hiện mối quan hệ một-nhiều vì nhiều tài liệu
4 tham chiếu đến cùng một tài liệu
author User @relation[fields: [authorId], references: [id]]
3
author User @relation[fields: [authorId], references: [id]]
24 trên ID và các trường vô hướng quan hệ
author User @relation[fields: [authorId], references: [id]]
Nếu ID mô hình của bạn là
25 [được biểu thị bằng trường
author User @relation[fields: [authorId], references: [id]]
26], bạn phải thêm
author User @relation[fields: [authorId], references: [id]]
24 vào ID của mô hình và trường vô hướng quan hệ ở phía bên kia của mối quan hệ
author User @relation[fields: [authorId], references: [id]]
2
author User @relation[fields: [authorId], references: [id]]
Quan hệ trong Prisma Client
Máy khách Prisma được tạo từ lược đồ Prisma. Các ví dụ sau minh họa cách các mối quan hệ thể hiện khi bạn sử dụng Máy khách Prisma để nhận, tạo và cập nhật bản ghi
Truy vấn sau đây tạo một bản ghi
3 và hai bản ghi
author User @relation[fields: [authorId], references: [id]]
4 được kết nối
author User @relation[fields: [authorId], references: [id]]
3
author User @relation[fields: [authorId], references: [id]]
Trong cơ sở dữ liệu cơ bản, truy vấn này
- Tạo một
3 với một
author User @relation[fields: [authorId], references: [id]]
90 được tạo tự động [ví dụ:
author User @relation[fields: [authorId], references: [id]]
32]
author User @relation[fields: [authorId], references: [id]]
- Tạo hai bản ghi
4 mới và đặt
author User @relation[fields: [authorId], references: [id]]
1 của cả hai bản ghi thành
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
32
author User @relation[fields: [authorId], references: [id]]
Truy vấn sau truy xuất một
3 của
author User @relation[fields: [authorId], references: [id]]
90 và bao gồm mọi bản ghi
author User @relation[fields: [authorId], references: [id]]
4 có liên quan
author User @relation[fields: [authorId], references: [id]]
3
model User {
id Int @id @default[autoincrement[]]
posts Post[]
}
model Post {
id Int @id @default[autoincrement[]]
author User @relation[fields: [authorId], references: [id]]
authorId Int // relation scalar field [used in the `@relation` attribute above]
}
Trong cơ sở dữ liệu cơ bản, truy vấn này
- Truy xuất bản ghi
3 với
author User @relation[fields: [authorId], references: [id]]
90 của
author User @relation[fields: [authorId], references: [id]]
32
author User @relation[fields: [authorId], references: [id]]
- Truy xuất tất cả các bản ghi
4 với một
author User @relation[fields: [authorId], references: [id]]
1 của
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
32
author User @relation[fields: [authorId], references: [id]]
Truy vấn sau liên kết bản ghi
4 hiện có với bản ghi
author User @relation[fields: [authorId], references: [id]]
3 hiện có
author User @relation[fields: [authorId], references: [id]]
2
author User @relation[fields: [authorId], references: [id]]
Trong cơ sở dữ liệu cơ bản, truy vấn này sử dụng truy vấn
37 lồng nhau để liên kết bài đăng có
model User {
id Int @id @default[autoincrement[]]
posts Post[]
}
model Post {
id Int @id @default[autoincrement[]]
author User @relation[fields: [authorId], references: [id]]
authorId Int // relation scalar field [used in the `@relation` attribute above]
}
90 trên 4 với người dùng có
author User @relation[fields: [authorId], references: [id]]
90 trên 20. Truy vấn thực hiện điều này với các bước sau
author User @relation[fields: [authorId], references: [id]]
- Trước tiên, truy vấn tìm kiếm người dùng có
90 của
author User @relation[fields: [authorId], references: [id]]
32
author User @relation[fields: [authorId], references: [id]]
- Sau đó, truy vấn đặt khóa ngoại
22 thành
author User @relation[fields: [authorId], references: [id]]
32. Điều này liên kết bài đăng với một
author User @relation[fields: [authorId], references: [id]]
90 của
author User @relation[fields: [authorId], references: [id]]
25 với người dùng với một
author User @relation[fields: [authorId], references: [id]]
90 của
author User @relation[fields: [authorId], references: [id]]
32
author User @relation[fields: [authorId], references: [id]]
Trong truy vấn này, giá trị hiện tại của
22 không thành vấn đề. Truy vấn thay đổi
author User @relation[fields: [authorId], references: [id]]
22 thành
author User @relation[fields: [authorId], references: [id]]
32, bất kể giá trị hiện tại của nó
author User @relation[fields: [authorId], references: [id]]
Các loại quan hệ
Có ba loại [hoặc số lượng] quan hệ khác nhau trong Prisma
- Một đối một [còn gọi là quan hệ 1-1]
- Một-nhiều [còn gọi là quan hệ 1-n]
- Nhiều-nhiều [còn gọi là quan hệ m-n]
Lược đồ Prisma sau bao gồm mọi loại quan hệ
- một đối một.
3 ↔
author User @relation[fields: [authorId], references: [id]]
82
author User @relation[fields: [authorId], references: [id]]
- một-nhiều.
3 ↔
author User @relation[fields: [authorId], references: [id]]
4
author User @relation[fields: [authorId], references: [id]]
- nhiều nhiều.
4 ↔
author User @relation[fields: [authorId], references: [id]]
86
author User @relation[fields: [authorId], references: [id]]
Cơ sở dữ liệu quan hệ
MongoDB
8
author User @relation[fields: [authorId], references: [id]]
Lược đồ này giống như mô hình dữ liệu ví dụ nhưng đã loại bỏ tất cả các trường vô hướng [ngoại trừ các đại lượng vô hướng của quan hệ bắt buộc] để bạn có thể tập trung vào các trường quan hệ.
Ví dụ này sử dụng quan hệ nhiều-nhiều ngầm định. Các mối quan hệ này không yêu cầu thuộc tính
2 trừ khi bạn cần phân biệt các mối quan hệ.
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
Lưu ý rằng cú pháp hơi khác nhau giữa cơ sở dữ liệu quan hệ và MongoDB - đặc biệt đối với quan hệ nhiều-nhiều
Đối với cơ sở dữ liệu quan hệ, sơ đồ mối quan hệ thực thể sau đây biểu thị cơ sở dữ liệu tương ứng với lược đồ Prisma mẫu
Đối với MongoDB, Prisma sử dụng thiết kế mô hình dữ liệu được chuẩn hóa, có nghĩa là các tài liệu tham chiếu lẫn nhau bằng ID theo cách tương tự với cơ sở dữ liệu quan hệ. Xem phần MongoDB để biết thêm chi tiết
Quan hệ nhiều-nhiều ngầm định và rõ ràng
Quan hệ nhiều-nhiều trong cơ sở dữ liệu quan hệ có thể được mô hình hóa theo hai cách
- quan hệ nhiều-nhiều rõ ràng, trong đó bảng quan hệ được biểu diễn dưới dạng một mô hình rõ ràng trong lược đồ Prisma của bạn
- quan hệ nhiều-nhiều ngầm định, trong đó Prisma quản lý bảng quan hệ và nó không xuất hiện trong lược đồ Prisma
Quan hệ nhiều-nhiều ngầm định yêu cầu cả hai mô hình phải có một
88. Hãy nhận biết những điều sau đây
author User @relation[fields: [authorId], references: [id]]
- Bạn không thể sử dụng ID nhiều trường
- Bạn không thể sử dụng
89 thay cho
author User @relation[fields: [authorId], references: [id]]
88
author User @relation[fields: [authorId], references: [id]]
Để sử dụng một trong hai tính năng này, thay vào đó, bạn phải thiết lập nhiều-nhiều rõ ràng
Mối quan hệ nhiều-nhiều ngầm định vẫn hiển thị trong một bảng quan hệ trong cơ sở dữ liệu cơ bản. Tuy nhiên, Prisma quản lý bảng quan hệ này
Nếu bạn sử dụng mối quan hệ nhiều-nhiều ngầm định thay vì mối quan hệ rõ ràng, điều đó sẽ làm cho API ứng dụng khách Prisma trở nên đơn giản hơn [ví dụ: vì bạn có ít cấp độ lồng nhau hơn bên trong các lần ghi lồng nhau]
Nếu bạn không sử dụng Prisma Migrate nhưng lấy mô hình dữ liệu của mình từ nội quan, bạn vẫn có thể tận dụng mối quan hệ nhiều-nhiều ngầm định bằng cách tuân theo các quy ước của Prisma cho các bảng quan hệ
trường quan hệ
Cơ sở dữ liệu quan hệ
MongoDB
8
author User @relation[fields: [authorId], references: [id]]
Các mô hình này có các trường sau
Cơ sở dữ liệu quan hệ
MongoDB
ModelFieldRelationalRelation field
3
author User @relation[fields: [authorId], references: [id]]
90
author User @relation[fields: [authorId], references: [id]]
83No
author User @relation[fields: [authorId], references: [id]]
84
author User @relation[fields: [authorId], references: [id]]
26No
author User @relation[fields: [authorId], references: [id]]
86
author User @relation[fields: [authorId], references: [id]]
87No
author User @relation[fields: [authorId], references: [id]]
0
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
89Yes [Prisma-level]
author User @relation[fields: [authorId], references: [id]]
4
author User @relation[fields: [authorId], references: [id]]
90
author User @relation[fields: [authorId], references: [id]]
83No
author User @relation[fields: [authorId], references: [id]]
03
author User @relation[fields: [authorId], references: [id]]
26No
author User @relation[fields: [authorId], references: [id]]
1
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
83No [relation scalar field]
author User @relation[fields: [authorId], references: [id]]
9
author User @relation[fields: [authorId], references: [id]]
3Yes [annotated]
author User @relation[fields: [authorId], references: [id]]
Cả
0 và
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
9 đều là các trường quan hệ vì kiểu của chúng không phải kiểu vô hướng mà là kiểu khác
author User @relation[fields: [authorId], references: [id]]
Cũng lưu ý rằng trường quan hệ được chú thích
9 cần liên kết trường quan hệ vô hướng
author User @relation[fields: [authorId], references: [id]]
1 trên mô hình
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
4 bên trong thuộc tính
author User @relation[fields: [authorId], references: [id]]
2. Vô hướng quan hệ đại diện cho khóa ngoại trong cơ sở dữ liệu cơ bản
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
Trường quan hệ khác có tên là
0 được xác định hoàn toàn ở cấp độ Prisma, nó không hiển thị trong cơ sở dữ liệu
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
Các trường quan hệ được chú thích
Các quan hệ yêu cầu một phía của quan hệ được chú thích bằng thuộc tính
2 được gọi là các trường quan hệ được chú thích. Điêu nay bao gôm
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
- quan hệ một đối một
- quan hệ một-nhiều
- quan hệ nhiều-nhiều chỉ dành cho MongoDB
Phía của quan hệ được chú thích bằng thuộc tính
2 đại diện cho phía lưu trữ khóa ngoại trong cơ sở dữ liệu bên dưới. Trường "thực tế" đại diện cho khóa ngoại cũng được yêu cầu ở phía đó của mối quan hệ, trường này được gọi là trường vô hướng của mối quan hệ và được tham chiếu bên trong thuộc tính
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
2
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
Cơ sở dữ liệu quan hệ
MongoDB
0
author User @relation[fields: [authorId], references: [id]]
Trường vô hướng trở thành trường vô hướng quan hệ khi nó được sử dụng trong thuộc tính
19 của thuộc tính
author User @relation[fields: [authorId], references: [id]]
2
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
trường vô hướng quan hệ
Các trường vô hướng quan hệ ở chế độ chỉ đọc trong API ứng dụng khách Prisma đã tạo. Nếu bạn muốn cập nhật một quan hệ trong mã của mình, bạn có thể làm như vậy bằng cách ghi lồng nhau
Quy ước đặt tên vô hướng quan hệ
Vì một trường vô hướng của quan hệ luôn thuộc về một trường quan hệ nên quy ước đặt tên sau đây là phổ biến
- trường quan hệ.
9
author User @relation[fields: [authorId], references: [id]]
- trường vô hướng quan hệ.
1 [tên trường quan hệ +
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
23]
author User @relation[fields: [authorId], references: [id]]
@relationattribute
Thuộc tính
2 chỉ có thể được áp dụng cho các trường quan hệ, không áp dụng cho các trường vô hướng
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
Thuộc tính
2 là bắt buộc khi
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
- bạn xác định quan hệ một đối một hoặc một đối nhiều, nó được yêu cầu ở một bên của mối quan hệ [với trường vô hướng quan hệ tương ứng]
- bạn cần định hướng một mối quan hệ [đó là e. g. trường hợp khi bạn có hai mối quan hệ giữa các mô hình giống nhau]
- bạn xác định mối quan hệ bản thân
- bạn xác định mối quan hệ nhiều-nhiều cho MongoDB
- bạn cần kiểm soát cách biểu diễn bảng quan hệ trong cơ sở dữ liệu bên dưới [e. g. sử dụng một tên cụ thể cho một bảng quan hệ]
Ghi chú. Quan hệ nhiều-nhiều ngầm định trong cơ sở dữ liệu quan hệ không yêu cầu thuộc tính
2
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
Quan hệ phân biệt
Khi bạn xác định hai quan hệ giữa hai mô hình giống nhau, bạn cần thêm đối số
27 vào thuộc tính
author User @relation[fields: [authorId], references: [id]]
2 để phân biệt chúng. Để làm ví dụ về lý do tại sao điều đó lại cần thiết, hãy xem xét các mô hình sau
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
Cơ sở dữ liệu quan hệ
MongoDB
1
author User @relation[fields: [authorId], references: [id]]
Trong trường hợp đó, các mối quan hệ là mơ hồ, có bốn cách khác nhau để giải thích chúng
29 ↔
author User @relation[fields: [authorId], references: [id]]
30 +
author User @relation[fields: [authorId], references: [id]]
31
author User @relation[fields: [authorId], references: [id]]
29 ↔
author User @relation[fields: [authorId], references: [id]]
33 +
author User @relation[fields: [authorId], references: [id]]
34
author User @relation[fields: [authorId], references: [id]]
35 ↔
author User @relation[fields: [authorId], references: [id]]
30 +
author User @relation[fields: [authorId], references: [id]]
31
author User @relation[fields: [authorId], references: [id]]
35 ↔
author User @relation[fields: [authorId], references: [id]]
33 +
author User @relation[fields: [authorId], references: [id]]
34
author User @relation[fields: [authorId], references: [id]]
Để phân biệt các mối quan hệ này, bạn cần chú thích các trường quan hệ bằng thuộc tính
2 và cung cấp đối số
{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }
27. Bạn có thể đặt bất kỳ
author User @relation[fields: [authorId], references: [id]]
27 nào [ngoại trừ chuỗi rỗng
author User @relation[fields: [authorId], references: [id]]
44], nhưng nó phải giống nhau ở cả hai phía của quan hệ
author User @relation[fields: [authorId], references: [id]]
Làm cách nào để khớp giá trị mảng trong MongoDB?
Toán tử $elemMatch khớp với các tài liệu chứa trường mảng có ít nhất một phần tử khớp với tất cả các tiêu chí truy vấn đã chỉ định. Nếu bạn chỉ xác định một điều kiệnCó khái niệm về khóa ngoại trong MongoDB không?
Không. MongoDB không hỗ trợ mối quan hệ khóa chính-khóa ngoại . MongoDB có trường khóa _id cho mọi tài liệu xác định duy nhất tài liệu cụ thể.MongoDB có hỗ trợ các ràng buộc khóa ngoại không?
MongoDB hỗ trợ các ràng buộc khóa ngoài .Làm cách nào để tạo các mối quan hệ khóa ngoài chính trong MongoDB?
Các khóa ngoại có thể được tạo dễ dàng. Hãy lấy hai bộ sưu tập, thành phố và quốc gia. Cả hai sẽ có một trường chung “country_id” để tham chiếu. Để tạo khóa ngoại, chỉ cần kéo và thả cột này lên cột kia .