Nodejs Mongoose Saving model undefined不是一个函数

Jav*_*edi 5 javascript save undefined mongoose node.js

我使用Nodejs Express路由和Mongoose来保存数据.我做了核心路线CRUD操作没有问题.但是,当我尝试在Model的某个字段上执行某些操作然后尝试使用model.save保存Model时,它说的是.save()方法:"undefined不是函数"

所以,这是代码.片段编号(1)工作得很好:

router.put('/:myId', function (req, res, next) {
var ourUpdateData = req.body;
Model.findOne({myId: req.params.myId.toString()}, function (err, foundModel) {
    if (err) throw err;

    if (ourUpdateData.fieldA) foundModel.fieldA = ourUpdateData.fieldA;
    if (ourUpdateData.fieldB) foundModel.fieldB = ourUpdateData.fieldB;
    if (ourUpdateData.fieldC) foundModel.fieldC = ourUpdateData.fieldC;
    if (ourUpdateData.fieldD) foundModel.fieldD = ourUpdateData.fieldD;
    if (typeof ourUpdateData.fieldArray === "object") ourUpdateData.fieldArray = ourUpdateData.fieldArray;

    foundModel.save(function (err, updatedModel) {
        if (err) throw err;
        res.send(updatedmodel);
    });
});
Run Code Online (Sandbox Code Playgroud)

});

所以模型有6个字段:fieldA,.. B,.. C,.. D,myId标识为索引,一个字段是一些值的字段fieldArray.上面的例子保存了Model,工作正常.但是,如果我现在尝试使用数组字段fieldArray做一些事情,然后保存模型,当我使用model.save()时,它会抛出"undefined is is a function".所以代码段(2)是产生此错误的代码:

    router.get('/:myId/:addThisToFieldArray', function(req, res, next) {
    var myId = req.params.myId;
    var addThisToFieldArray = req.params.addThisToFieldArray;
    Model.find({myId: myId}, function (err, model) {
        if (err) throw err;
        var fieldArray = model.fieldArray;
        fieldArray.push("New thing to FieldArray");
        var newFieldArray = fieldArray;
        if (typeof newFieldArray === "object") model.fieldArray = newFieldArray;
        model.save(function (err, updatedModel){
            if (err) throw err;
            res.send(updatedModel);
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

所以上面的东西抛出"undefined不是函数"使用model.save(..)

我也尝试了片段的第二个变体(2),让我们称它为片段(3),并入.exec()也不起作用,在model.save(...)上抛出相同的"undefined is not a function"所以代码片段(3)是这样的:

    router.get('/:myId/:addThisToFieldArray', function(req, res, next) {
    var myId = req.params.myId;
    var addThisToFieldArray = req.params.addThisToFieldArray;
    Model.find({myId: myId}).exec(function (err, model) {
        if (err) throw err;
        var fieldArray = model.fieldArray;
        fieldArray.push("New thing to FieldArray");
        var newFieldArray = fieldArray;
        if (typeof newFieldArray === "object") model.fieldArray = newFieldArray;
        model.save(function (err, updatedModel){
            if (err) throw err;
            res.send(updatedModel);
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

我会很高兴任何意见和建议!

对威尔森的尝试进行了回顾:

是的,我知道当我调用model.find(..它给出数组,如果我调用model.findOne(..它给出一个对象json)

我试图简化我的例子,在我的版本中我实际上使用了:"model [0] .fieldArray = newFieldArray"从Array拳头(数组本身)获取东西,然后分配给新值.

问题仍然存在,它给了我model.save(.."undefined不是一个函数")

目前的代码是:

    router.get('/:myId/:addThisToFieldArray', function(req, res, next) {
    var myId = req.params.myId;
    var addThisToFieldArray = req.params.addThisToFieldArray;
    Model.find({myId: myId}).exec(function (err, model) {
        if (err) throw err;
        var fieldArray = model[0].fieldArray;
        fieldArray.push("New thing to FieldArray");
        var newFieldArray = fieldArray;
        if (typeof newFieldArray === "object") model[0].fieldArray = newFieldArray;
        model.save(function (err, updatedModel){
            if (err) throw err;
            res.send(updatedModel);
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

上面的代码片段(4)给出了model.save(.."undefined不是函数"

Wil*_*son 9

当您在Mongoose中使用该find方法时,它将返回一个数组,因为它可以发现一个或多个文档,因此在您的示例中,您通过其id查询一个特定元素,您应该获取返回数组上的第一个元素:

     Model.find({myId: myId}).exec(function (err, documents) {
            var model = documents[0];

            if (err) throw err;
            var fieldArray = model[0].fieldArray;

这是一个例子:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost:27017/java-jedi');

var HackerSchema = new Schema({
  name: String,
  languages: [String]
});

var Hacker = mongoose.model('Hacker', HackerSchema);


// instantiating the model.
var oneHacker = new Hacker();
oneHacker.name = 'Richard Stallman';

oneHacker.save(function(err) {
  if (err) throw err;

  // finding the document intentionally for this example
  Hacker.find({_id: oneHacker._id}, function(err, hackers) {
    var hacker = hackers[0];

    // modifying the document and updating it.
    hacker.languages.push('Lisp');
    hacker.save(function(err) {
      if (err) throw err;

      console.log(hacker);
    });
  });

});
Run Code Online (Sandbox Code Playgroud)