我正在使用 React Typescript Next 和 prisma 做项目,我正在尝试使用最初为空的数组作为播放列表字段创建用户,我没有收到任何错误,但是当我刷新数据库(mongodb)时,我在新创建的用户上看不到播放列表属性。首先我认为如果它是空的我就看不到它,但是当我想调用它并更新这个字段时,我意识到这是不可能的。
我的 schema.prisma 文件:
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
name String
email String @unique
emailVerified DateTime
image String?
hashedPassword String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
playlists Playlist[]
recentSearches Json[]
liked Json
}
model Playlist {
id String @id @default(auto()) @map("_id") @db.ObjectId
name String
tracks Json[]
image String?
isPublic Boolean @default(true)
author String?
User User @relation(fields: [userId], references: [id])
userId String @db.ObjectId
}
我的注册用户逻辑:
export default async function handler(
req: NextApiRequest,
res: NextApiResponse
) {
if (req.method !== "POST") {
return res.status(405).end();
}
try {
const { email, name, password } = req.body;
const existingUser = await prismadb.user.findUnique({ where: { email } });
if (existingUser) {
return res
.status(422)
.json({ error: "Email is already taken", cause: "email" });
}
const hashedPassword = await bcrypt.hash(password, 12);
const user = await prismadb.user.create({
data: {
email,
name,
hashedPassword,
image: "",
emailVerified: new Date(),
recentSearches: [],
liked: {},
playlists: { create: [] },
},
});
return res.status(200).json(user);
} catch (error) {
console.log(error);
return res.status(400).json(error);
}
}
我尝试使用 create 和 createMany 属性但没有任何效果,我意识到如果我使用 Json[] 而不是 Playlist[] 它可以工作,但我希望将 Playlists[] 作为一种类型。 我希望在数据库中创建一个具有空播放列表字段数组的用户。
在 MongoDB 中,最初为空或未显式设置的字段的行为与传统 SQL 数据库不同。在 MongoDB 中,文档中未设置的字段不会存储在数据库中。这与 SQL 数据库不同,在 SQL 数据库中,所有列都存在于每一行中,并且显式表示空字段。
在 Prisma 架构中,
playlists
字段默认定义为空数组:
playlists Playlist[]
当您使用 Prisma 和 MongoDB 创建新用户时,如果
playlists
字段为空,则不会将其存储在数据库中,因为 MongoDB 默认不存储空数组的字段。
如果您想确保
playlists
字段始终存在于用户文档中,即使它最初为空,您也可以修改架构以明确为该字段设置默认值:
playlists Playlist[] @default([])
进行此更改后,您可能需要重新生成 Prisma 客户端以应用更新后的架构:
npx prisma generate