从 MongoDB 数据库中抽取随机获胜条目的问题(使用 Mongoose 和 NodeJS)
Problems with drawing a random winning entry from a MongoDB database (with Mongoose & NodeJS)
我正在努力使用 MongoDB、Mongoose 和 NodeJS 让以下代码正常工作。我有两个模式,一个保存唯一的用户配置文件,另一个保存他们的条目(这样他们就可以多次输入)。所有条目都有效(此处未显示),只是获胜者的 selection 无效。它应该从集合中随机 select 一个条目,找到它们的独特配置文件并将 'won' 布尔值设置为 true 并删除集合中的所有条目。它目前执行 none 这些事情(但我已经检查了路由一切正常并且触发了 const),因此非常感谢您的帮助。我尝试了各种方法,但在任何地方都找不到明确的指导。谢谢
控制器
const { Enter } = require('../models/user_entry');
const { UserProfile } = require("../models/User_Profile");
const drawWinner = async (req, res) => {
const winner = Enter.aggregate([{ $sample: { size: 1 } }]);
const users_profile = await UserProfile.findOne({ handle: winner.user });
users_profile,{"$set":{"won":true}};
await users_profile.save();
Enter.deleteMany({ });
};
module.exports = {
drawWinner
};
机型:
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
// Create Entry Schema
const EntrySchema = new Schema({
user: {
type: String,
required: true,
},
});
const Enter = mongoose.model("entries", EntrySchema);
module.exports = { Enter };
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
// Create Profile Schema
const UserProfileSchema = new Schema({
user: {
type: Schema.Types.ObjectId,
ref: "user",
},
handle: {
type: String,
required: true,
trim: true,
unique: true,
},
won: {
type: Boolean,
default: false,
},
});
const UserProfile = mongoose.model("profile", UserProfileSchema);
module.exports = { UserProfile };
您在聚合数据库时缺少 await
const winner = await Enter.aggregate([{ $sample: { size: 1 } }]);
您可能还想 console.log(winner)
以检查是否从数据库中取回任何数据。
编辑
根据您的评论,您将获得 winner.user
价值
您使用更新用户的方式很奇怪,试试这个
let updated_user = await UserProfile.findOneAndUpdate({ handle: winner.user }, { won: true },{ new: true });
你可以删除这3行
const users_profile = await UserProfile.findOne({ handle: winner.user });
users_profile,{"$set":{"won":true}};
await users_profile.save();
同时 deleting
条目使用 await Enter.deleteMany({});
您还需要发回一些响应res.send()
否则服务器会挂起。
我正在努力使用 MongoDB、Mongoose 和 NodeJS 让以下代码正常工作。我有两个模式,一个保存唯一的用户配置文件,另一个保存他们的条目(这样他们就可以多次输入)。所有条目都有效(此处未显示),只是获胜者的 selection 无效。它应该从集合中随机 select 一个条目,找到它们的独特配置文件并将 'won' 布尔值设置为 true 并删除集合中的所有条目。它目前执行 none 这些事情(但我已经检查了路由一切正常并且触发了 const),因此非常感谢您的帮助。我尝试了各种方法,但在任何地方都找不到明确的指导。谢谢
控制器
const { Enter } = require('../models/user_entry');
const { UserProfile } = require("../models/User_Profile");
const drawWinner = async (req, res) => {
const winner = Enter.aggregate([{ $sample: { size: 1 } }]);
const users_profile = await UserProfile.findOne({ handle: winner.user });
users_profile,{"$set":{"won":true}};
await users_profile.save();
Enter.deleteMany({ });
};
module.exports = {
drawWinner
};
机型:
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
// Create Entry Schema
const EntrySchema = new Schema({
user: {
type: String,
required: true,
},
});
const Enter = mongoose.model("entries", EntrySchema);
module.exports = { Enter };
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
// Create Profile Schema
const UserProfileSchema = new Schema({
user: {
type: Schema.Types.ObjectId,
ref: "user",
},
handle: {
type: String,
required: true,
trim: true,
unique: true,
},
won: {
type: Boolean,
default: false,
},
});
const UserProfile = mongoose.model("profile", UserProfileSchema);
module.exports = { UserProfile };
您在聚合数据库时缺少 await
const winner = await Enter.aggregate([{ $sample: { size: 1 } }]);
您可能还想 console.log(winner)
以检查是否从数据库中取回任何数据。
编辑
根据您的评论,您将获得 winner.user
价值
您使用更新用户的方式很奇怪,试试这个
let updated_user = await UserProfile.findOneAndUpdate({ handle: winner.user }, { won: true },{ new: true });
你可以删除这3行
const users_profile = await UserProfile.findOne({ handle: winner.user });
users_profile,{"$set":{"won":true}};
await users_profile.save();
同时 deleting
条目使用 await Enter.deleteMany({});
您还需要发回一些响应res.send()
否则服务器会挂起。