Mảng mongodb của các khóa ngoại

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

author User @relation(fields: [authorId], references: [id])

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

Lược đồ Prisma sau đây xác định mối quan hệ một-nhiều giữa các mô hình

author User @relation(fields: [authorId], references: [id])

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

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ệ

author User @relation(fields: [authorId], references: [id])

3 /

author User @relation(fields: [authorId], references: [id])

4 được tạo thành từ

  • Hai trường quan hệ.

    author User @relation(fields: [authorId], references: [id])

    9 và

    { "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

    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
  • Trường

    { "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

    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

    author User @relation(fields: [authorId], references: [id])

    4 và

    author User @relation(fields: [authorId], references: [id])

    3

Ở 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

author User @relation(fields: [authorId], references: [id])

3 và

author User @relation(fields: [authorId], references: [id])

4 trong cơ sở dữ liệu quan hệ

Mảng mongodb của các khóa ngoại

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

    author User @relation(fields: [authorId], references: [id])

    4 có tên là

    { "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

    1
  • Một cột khóa chính trong bảng

    author User @relation(fields: [authorId], references: [id])

    3 có tên là

    author User @relation(fields: [authorId], references: [id])

    90. Cột

    { "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

    1 trong bảng

    author User @relation(fields: [authorId], references: [id])

    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

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

{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

2 trên trường

author User @relation(fields: [authorId], references: [id])

9

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

author User @relation(fields: [authorId], references: [id])

3 (trong bộ sưu tập

author User @relation(fields: [authorId], references: [id])

3)

{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

Danh sách các tài liệu

author User @relation(fields: [authorId], references: [id])

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

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

author User @relation(fields: [authorId], references: [id])

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ệ

Nếu ID mô hình của bạn là

author User @relation(fields: [authorId], references: [id])

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

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

author User @relation(fields: [authorId], references: [id])

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

Trong cơ sở dữ liệu cơ bản, truy vấn này

  1. Tạo một

    author User @relation(fields: [authorId], references: [id])

    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)
  2. Tạo hai bản ghi

    author User @relation(fields: [authorId], references: [id])

    4 mới và đặt

    { "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

    1 của cả hai bản ghi thành

    author User @relation(fields: [authorId], references: [id])

    32

Truy vấn sau truy xuất một

author User @relation(fields: [authorId], references: [id])

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

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)

}

3

Trong cơ sở dữ liệu cơ bản, truy vấn này

  1. Truy xuất bản ghi

    author User @relation(fields: [authorId], references: [id])

    3 với

    author User @relation(fields: [authorId], references: [id])

    90 của

    author User @relation(fields: [authorId], references: [id])

    32
  2. Truy xuất tất cả các bản ghi

    author User @relation(fields: [authorId], references: [id])

    4 với một

    { "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

    1 của

    author User @relation(fields: [authorId], references: [id])

    32

Truy vấn sau liên kết bản ghi

author User @relation(fields: [authorId], references: [id])

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

Trong cơ sở dữ liệu cơ bản, truy vấn này sử dụng truy vấn

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)

}

37 lồng nhau để liên kết bài đăng có

author User @relation(fields: [authorId], references: [id])

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

  • Trước tiên, truy vấn tìm kiếm người dùng có

    author User @relation(fields: [authorId], references: [id])

    90 của

    author User @relation(fields: [authorId], references: [id])

    32
  • Sau đó, truy vấn đặt khóa ngoại

    author User @relation(fields: [authorId], references: [id])

    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

Trong truy vấn này, giá trị hiện tại của

author User @relation(fields: [authorId], references: [id])

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ó

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.

    author User @relation(fields: [authorId], references: [id])

    3 ↔

    author User @relation(fields: [authorId], references: [id])

    82
  • một-nhiều.

    author User @relation(fields: [authorId], references: [id])

    3 ↔

    author User @relation(fields: [authorId], references: [id])

    4
  • nhiều nhiều.

    author User @relation(fields: [authorId], references: [id])

    4 ↔

    author User @relation(fields: [authorId], references: [id])

    86

Cơ sở dữ liệu quan hệ

MongoDB

author User @relation(fields: [authorId], references: [id])

8

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

{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

2 trừ khi bạn cần phân biệt các mối quan hệ.

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

Mảng mongodb của các khóa ngoại

Đố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

author User @relation(fields: [authorId], references: [id])

88. Hãy nhận biết những điều sau đây

  • Bạn không thể sử dụng ID nhiều trường
  • Bạn không thể sử dụng

    author User @relation(fields: [authorId], references: [id])

    89 thay cho

    author User @relation(fields: [authorId], references: [id])

    88

Để 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

author User @relation(fields: [authorId], references: [id])

8

Các mô hình này có các trường sau

Cơ sở dữ liệu quan hệ

MongoDB

ModelFieldRelationalRelation field

author User @relation(fields: [authorId], references: [id])

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

{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

0

author User @relation(fields: [authorId], references: [id])

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

{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

1

author User @relation(fields: [authorId], references: [id])

83No (relation scalar field)

author User @relation(fields: [authorId], references: [id])

9

author User @relation(fields: [authorId], references: [id])

3Yes (annotated)

Cả

{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

0 và

author User @relation(fields: [authorId], references: [id])

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

Cũng lưu ý rằng trường quan hệ được chú thích

author User @relation(fields: [authorId], references: [id])

9 cần liên kết trường quan hệ vô hướng

{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

1 trên mô hình

author User @relation(fields: [authorId], references: [id])

4 bên trong thuộc tính

{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

2. Vô hướng quan hệ đại diện cho khóa ngoại trong cơ sở dữ liệu cơ bản

Trường quan hệ khác có tên là

{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

0 được xác định hoàn toàn ở cấp độ Prisma, nó không hiển thị trong cơ sở dữ liệu

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

{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

2 được gọi là các trường quan hệ được chú thích. Điêu nay bao gôm

  • 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

{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

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

Cơ sở dữ liệu quan hệ

MongoDB

author User @relation(fields: [authorId], references: [id])

0

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

author User @relation(fields: [authorId], references: [id])

19 của thuộc tính

{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

2

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ệ.

    author User @relation(fields: [authorId], references: [id])

    9
  • trường vô hướng quan hệ.

    { "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

    1 (tên trường quan hệ +

    author User @relation(fields: [authorId], references: [id])

    23)

@relationattribute

Thuộc tính

{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

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

Thuộc tính

{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

2 là bắt buộc khi

  • 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

{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

2

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ố

author User @relation(fields: [authorId], references: [id])

27 vào thuộc tính

{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

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

Cơ sở dữ liệu quan hệ

MongoDB

author User @relation(fields: [authorId], references: [id])

1

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

  • author User @relation(fields: [authorId], references: [id])

    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

Để 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

{ "_id": { "$oid": "60d5922d00581b8f0062e3a8" }, "name": "Ella" }

2 và cung cấp đối số

author User @relation(fields: [authorId], references: [id])

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ệ

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ện

Có 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 .