从 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()否则服务器会挂起。