我正在try 返回来自2个模式的数据.其中一个包含"玩家"的信息,另一个包含每个"玩家"按游戏的"得分"信息.
This is my 'Player' schema:个
import { Schema, model, models } from "mongoose";
const PlayerSchema = new Schema({
creator: {
type: Schema.Types.ObjectId,
ref: 'User',
},
name: {
type: String,
require: [ true, 'Name is required!' ],
},
email: {
type: String,
unique: [ true, 'Email already exist!' ],
required: [ true, 'Email is required!' ],
}
});
const Player = models.Player || model( 'Player', PlayerSchema );
export default Player;
This is my 'Score' schema:. (note this one also contain a subdocuments content).
import { Schema, model, models } from "mongoose";
const scoresToSave = new Schema({
player: {
type: Schema.Types.ObjectId,
ref: 'Player',
},
score: { type: Number }
});
const ScoreSchema = new Schema({
creator: {
type: Schema.Types.ObjectId,
ref: 'User',
},
tournament: {
type: Schema.Types.ObjectId,
ref: 'Tournament',
},
date: {
type: Date,
require: [ true, 'Date is required!' ],
},
scores: [scoresToSave],
});
const Score = models.Score || model( 'Score', ScoreSchema );
export default Score;
This is an example of the actual documents saved in the Collections.个
Players:个
{
"_id":{"$oid":"652f3470729e8d8a59b221dd"},
"creator":{"$oid":"652af415729e8d8a59b2202f"},
"name":"Player 1",
"email":"player1@email.com"
}
{
"_id":{"$oid":"652f36c9f6ad40c3aedf0cdf"},
"creator":{"$oid":"652af415729e8d8a59b2202f"},
"name":"Player 2",
"email":"player2@email.com"
}
Scores个
{
"_id":{"$oid":"65386103b5e6b094e0980f2a"},
"creator":{"$oid":"652af415729e8d8a59b2202f"},
"tournament":{"$oid":"652f2515729e8d8a59b221b6"},
"date":{"$date":{"$numberLong":"1698192000000"}},
"scores":[
{
"player":{"$oid":"652f3470729e8d8a59b221dd"},
"score":{"$numberInt":"10"},
"_id":{"$oid":"65386103b5e6b094e0980f2b"}
},
{
"player":{"$oid":"652f36c9f6ad40c3aedf0cdf"},
"score":{"$numberInt":"20"},
"_id":{"$oid":"65386103b5e6b094e0980f2c"}
}
]
}
{
"_id":{"$oid":"6538611bb5e6b094e0980f59"},
"creator":{"$oid":"652af415729e8d8a59b2202f"},
"tournament":{"$oid":"652f2515729e8d8a59b221b6"},
"date":{"$date":{"$numberLong":"1698192000000"}},
"scores":[
{
"player":{"$oid":"652f3470729e8d8a59b221dd"},
"score":{"$numberInt":"11"},
"_id":{"$oid":"6538611bb5e6b094e0980f5a"}
},
{
"player":{"$oid":"652f36c9f6ad40c3aedf0cdf"},
"score":{"$numberInt":"21"},
"_id":{"$oid":"6538611bb5e6b094e0980f5b"}
}
]
}
This is the data structure that I want to create as response:个
[
{
_id: new ObjectId("652f3470729e8d8a59b221dd"),
name: 'Player 1',
email: 'player1@email.com',
totalScore: 21
},
{
_id: new ObjectId("6536f85cb5e6b094e09809f1"),
name: 'Player 2',
email: 'player2@email.com',
totalScore: 41
},
]
My actual code to try to get that data structure is:个
import { connectToDB } from "@utils/database";
import Player from "@models/player";
export const GET = async ( req ) => {
const resources = {
"_id": "$_id",
name: { "$first": "$name" },
email: { "$first": "$email" },
"totalScore": { "$sum": "scores.scores.score" },
};
try {
await connectToDB();
const players = await Player.aggregate([
{
$group: resources
}, {
$lookup: {
from: "Scores",
localField: "_id",
foreignField: "scores.player",
as: "score"
}
}
]);
console.log('TRY: ', players);
return new Response(
JSON.stringify(players),
{status: 200}
);
} catch (error) {
return new Response(
"Failed to fetch all players",
{status: 500}
);
}
}
This is what 100 returns:
TRY: [
{
_id: new ObjectId("652f3470729e8d8a59b221dd"),
name: 'Player 1',
email: 'player1@email.com',
totalScore: 0,
score: []
},
{
_id: new ObjectId("6536f85cb5e6b094e09809f1"),
name: 'Player 2',
email: 'player2@email.com',
totalScore: 0,
score: []
},
]
有人能帮我弄明白我错过了什么吗?
谢谢!