【问题标题】:Problems with drawing a random winning entry from a MongoDB database (with Mongoose & NodeJS)从 MongoDB 数据库中抽取随机获胜条目的问题(使用 Mongoose 和 NodeJS)
【发布时间】:2022-02-19 06:39:29
【问题描述】:

我正在努力使用 MongoDB、Mongoose 和 NodeJS 使以下代码正常工作。我有两种模式,一种用于保存唯一的用户配置文件,另一种用于保存他们的条目(这样他们可以多次输入)。条目都有效(此处未显示),只是获胜者的选择无效。它应该从集合中随机选择一个条目,找到它们的唯一配置文件并将“won”布尔值设置为 true 并删除集合中的所有条目。它目前没有做任何这些事情(但我已经检查了路由一切正常并且触发了 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 }; 

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您在聚合数据库时缺少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(),否则服务器会挂起。

    【讨论】:

    • 您好,感谢您的回复。我添加了 await 和 console.log(winner); console.log(winner.user);我仍然从服务器收到错误 500。我在服务器日志中得到以下信息:app[web.1]: [ app[web.1]: { app[web.1]: _id: new ObjectId("620faf28dc6771be8cdf2e88"), app[web.1]: user: 'johndoe13', app[web.1]: __v: 0 app[web.1]: } app[web.1]: ] app[web.1]: undefined 我猜未定义的winner.user 将阻止其余的工作。请问您知道如何解决这个问题吗?
    • 检查更新!!!
    • 非常感谢!获胜者.user 仍然是未定义的,所以我做了一些测试,发现聚合函数返回的是一个数组,而不是一个对象。我做了以下修复,然后一切正常:const winner = await Enter.aggregate([{ $sample: { size: 1 } }]); const winnerObject = await winner.shift(); let updated_user = await UserProfile.findOneAndUpdate({ handle: winnerObject.user }, { won: true, $inc: {winnings: totals.thisWeek} },{ new: true }); 感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    相关资源
    最近更新 更多