【问题标题】:I don't understand how to use the findOrCreate method with mongoose我不明白如何将 findOrCreate 方法与猫鼬一起使用
【发布时间】:2025-12-17 20:15:01
【问题描述】:

遵循此架构 cap.model.js :

const mongoose = require('mongoose');
const findOrCreate = require ('mongoose-findorcreate')
const Schema = mongoose.Schema;

let CapSchema = new Schema ({
  title: {type: String},
  list: {type: Array}
});

CapSchema.plugin(findOrCreate);

module.exports = mongoose.model('Cap', CapSchema);

我想使用以下数据从 get('/url/:param1') 中检索数据:

  1. 查找列表包含 param1 的文档,并在数组中返回它们的标题。

  2. 找到标题为 param1 的文档,并返回其列表。或者,如果它不存在,请创建文档。在这两种情况下,还返回其标题。

然后我想 console.log : 一侧是标题 (2),另一侧是由标题数组 (1) 和列表 (2) 组成的数组。

我的问题是我找不到或不理解方法 findOrCreate (https://www.npmjs.com/package/mongoose-findorcreate) 以及我必须使用哪些参数。

我的代码目前看起来像这样:

在 route.js 中:

const express = require('express');
const router = express.Router();

const cap_controller = require('../controllers/cap.controller');

router.get('/:param1', cap_controller.cap_get);

module.exports = router;

在 cap.controller.js 中:

const Cap = require('../models/cap.model');

const foc = Cap.findOrCreate({},
  function(err, cap) {
    console.log(req.params.word + ' has been created !', word.main);
    },
    'title list');

exports.cap_get = function (req, cb) {
  let capTitle = req.params.param1;
  cb(capTitle);
  };

我一直不明白什么时候方法需要参数以及回调函数需要什么样的参数。

【问题讨论】:

标签: javascript node.js methods mongoose find


【解决方案1】:

在你的 cap.controller.js 中有很多错误。首先,为什么foc 方法在cap_get 之外?其次,您从不调用foc 方法,为什么?

在您的情况下,您想检查是否存在具有参数给定标题的Cap,如果不存在,请创建它。

您可以像这样简单地实现:

exports.cap_get = function (req, res, next) {
  let capTitle = req.params.param1;

  Cap.findOrCreate({ title: capTitle }, function(err, cap) {
    if (err) return next(err);

    console.log(capTitle + ' has been created !');

    res.status(200).json({ title: capTitle });
  });
};

cap_get 只是一个带有(req, res, next) 签名的快速回调,findOrCreate 第一个参数是主键,所以如果此键(标题)不存在大写字母,它将创建它否则它会返回文档。

您必须确保上限的标题是唯一的以避免潜在问题:

let CapSchema = new Schema ({
  title: {type: String, unique: true},
  list: {type: Array}
});

【讨论】:

  • 谢谢,我把所有的 mongoose 方法混在一起,不知道如何在不进行回调的情况下提取文档的一个元素。