大佬教程收集整理的这篇文章主要介绍了node.js – Mongoose:无法使用$addToSet或$push将新对象添加/推送到数组,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我的架构和模型如下.
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); });
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,请注明来意。