Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js – Mongoose:无法使用$addToSet或$push将新对象添加/推送到数组大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
使用Nodejs,Hapijs和Mongoose.

我的架构和模型如下.

var scheR_197_11845@a = {
    name: {
        type: String,required: true
    },lectures: {}
};

var mongoosescheR_197_11845@a = new mongoose.scheR_197_11845@a(scheR_197_11845@a,{
    collection: "Users"
});
mongoose.model("Users",mongoosescheR_197_11845@a);

出于某种原因,我需要保持“讲座”
作为混合型.

在保存/创建文档时,我创建了一个嵌套属性lectures.physics.topic [],其中topic是一个数组.

现在,我正在尝试使用$addToSet或$push将新对象添加/推送到“lectures.physics.topic”.

userModel.findByIdAndupdateAsync(user._id,{
    $addToSet: {
        "lectures.physics.topic": {
            "name": "Fluid Mechanics","day": "Monday","faculty": "Nancy Wagner"
        }
    }
});

但该文件根本没有得到更新.我也试过使用$push.没有任何效果.可能是什么问题呢?

我试图使用mongoclient的另一种方法,直接更新数据库.它的工作原理请找到下面的代码

db.collection("Users").update({
   "_id": user._id
 },{
 $addToSet: {
        "lectures.physics.topic": {
            "name": "Fluid Mechanics","faculty": "Nancy Wagner"
        }
    }
 },function(err,result) {
   if (err) {
       console.log("SupeRMAN!");
       console.log(err);
       return;
   }
 console.log(result);     
 });

我必须在每次请求被启动时启动mongo客户端.这不是一个可行的解决方案.

解决方法

我会在这上面称之为“bug”. Mongoose显然做了错误的事情,如后面所示的日志记录中可以证明的那样.但是这里有一个列表,它使用您尝试执行的相同更新从本机驱动程序调用.findOneAndupdate()

var async = require('async'),mongoose = require('mongoose'),scheR_197_11845@a = mongoose.scheR_197_11845@a;

mongoose.connect('mongodb://localhost/school');
mongoose.set('debug',truE);

var userscheR_197_11845@a = new scheR_197_11845@a({
  name: {
    type: String,required: true
  },lectures: { type: scheR_197_11845@a.Types.Mixed }
});

var User = mongoose.model( "User",userscheR_197_11845@a );

function logger(data) {
  return JSON.Stringify(data,undefined,2);
}

async.waterfall(
  [
    function(callBACk) {
      User.remove({},function(err) {
        callBACk(err);
      });
    },function(callBACk) {
      console.log("here");
      var user = new User({ "name": "bob" });
      user.save(function(err,user) {
        callBACk(err,user);
      });
    },function(user,callBACk) {
      console.log("Saved: %s",logger(user));
      User.collection.findOneAndupdate(
        { "_id": user._id },{
          "$addToSet": {
            "lectures.physics.topic": {
              "name": "Fluid Mechanics","faculty": "Nancy Wagner"
            }
          }
        },{ "returnOriginal": false },user) {
          callBACk(err,user);
        }
      );
    }
  ],user) {
    if (err) throw err;
    console.log("Modified: %s",logger(user));
    mongoose.disconnect();
  }
);

这与结果完美配合:

Saved: {
  "__v": 0,"name": "bob","_id": "55cda1f5b5ee8b870e2f53bd"
}
Modified: {
  "lastErrorObject": {
    "updatedExisTing": true,"n": 1
  },"value": {
    "_id": "55cda1f5b5ee8b870e2f53bd","__v": 0,"lectures": {
      "physics": {
        "topic": [
          {
            "name": "Fluid Mechanics","faculty": "Nancy Wagner"
          }
        ]
      }
    }
  },"ok": 1
}

你需要小心,因为本机驱动程序方法不像mongoose方法那样知道连接状态.因此,您需要确保通过先前触发的“mongoose”方法建立连接,或者将您的应用程序包装在连接事件中,如下所示:

@H_215_9@mongoose.connection.on("connect",function(err) { // start app in here });

至于“bug”,请查看此列表的日志记录输出

var async = require('async'),logger(user));
      User.findByIdAndupdate(
        user._id,{ "new": true },logger(user));
    mongoose.disconnect();
  }
);

并且使用mongoose日志记录的记录输出

@H_215_9@mongoose: users.remove({}) {} here Mongoose: users.insert({ name: 'bob',_id: ObjectId("55cda2d2462283c90ea3f1ad"),__v: 0 }) Saved: { "__v": 0,"_id": "55cda2d2462283c90ea3f1ad" } Mongoose: users.findOne({ _id: ObjectId("55cda2d2462283c90ea3f1ad") }) { new: true,fields: undefined } Modified: { "_id": "55cda2d2462283c90ea3f1ad","__v": 0 }

所以真正的“什么是软糖?”风格,那里有一个叫.findOne()的电话?这不是问的问题.此外,当然数据库中没有任何改变,因为进行了错误调用.所以即使是{“new”:truE}这里也是多余的.

这种情况发生在具有“混合”模式类型的所有级别.

就个人而言,我不会像这样嵌套在“对象”中,只是将“对象键”作为标准数组的一部分作为附加属性. MongoDB和mongoose都对此更加满意,并且查询具有这种结构的信息要容易得多.

var async = require('async'),truE);

var lecturescheR_197_11845@a = new scheR_197_11845@a({
  "subject": String,"topic": String,"day": String,"faculty": String
});

var userscheR_197_11845@a = new scheR_197_11845@a({
  name: {
    type: String,lectures: [lecturescheR_197_11845@a]
});

var User = mongoose.model( "User",{
          "$addToSet": {
            "lectures": {
              "subject": "physics","topic": "Fluid Mechanics",logger(user));
    mongoose.disconnect();
  }
);

输出

@H_215_9@mongoose: users.remove({}) {} here Mongoose: users.insert({ name: 'bob',_id: ObjectId("55cda4dc40f2a8fb0e5cdf8b"),lectures: [],"_id": "55cda4dc40f2a8fb0e5cdf8b","lectures": [] } Mongoose: users.findAndModify({ _id: ObjectId("55cda4dc40f2a8fb0e5cdf8b") }) [] { '$addToSet': { lectures: { faculty: 'Nancy Wagner',day: 'Monday',topic: 'Fluid Mechanics',subject: 'physics',_id: ObjectId("55cda4dc40f2a8fb0e5cdf8c") } } } { new: true,upsert: false,remove: false } Modified: { "_id": "55cda4dc40f2a8fb0e5cdf8b","lectures": [ { "faculty": "Nancy Wagner","subject": "physics","_id": "55cda4dc40f2a8fb0e5cdf8c" } ] }

这样工作正常,你不需要挖掘原生方法只是为了让它工作.

数组的属性使查询和过滤非常容易,以及跨数据的“聚合”信息,对于所有这些信息,MongoDB都喜欢引用所有信息的“严格路径”.否则,您只会向“特定键”进行区分,如果不提及每个可能的“组合键”,则无法对其进行索引或搜索.

像这样的属性一个更好的方法.这里没有错误.

大佬总结

以上是大佬教程为你收集整理的node.js – Mongoose:无法使用$addToSet或$push将新对象添加/推送到数组全部内容,希望文章能够帮你解决node.js – Mongoose:无法使用$addToSet或$push将新对象添加/推送到数组所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。