无法使用mongoose将对象添加到MongoDB中的数组中?

我正在创build一个nodejs和mongodb的应用程序,我有这样的:

var mongoose = require('mongoose'); var db = mongoose.connect("mongodb://localhost/dbTienda"); var esquemaUsuarios = new mongoose.Schema({ nombre: String, apellido: String, email: String, contrasena: String, notificaciones: Number, notificacionesLista: [String], articulos_vendidos: Number, productos: [{ nombre: String, imgPath: String, precio: Number, ciudades: [String], tags: [String], descripcion: String }] }), usuarios = db.model("Usuarios",esquemaUsuarios); 

问题是我不能在productos中添加任何东西,我的想法是做一些这样的

 productos: { {nombre:XXXXX,imgepath:XXXXX,precio:XXXXX,ciudades:{ XXXXX },tags:{ XXXXX },descripcion: XXXXX}, {nombre:XXXXX,imgepath:XXXXX,precio:XXXXX,ciudades:{ XXXXX },tags:{ XXXXX },descripcion: XXXXX}, {nombre:XXXXX,imgepath:XXXXX,precio:XXXXX,ciudades:{ XXXXX },tags:{ XXXXX },descripcion: XXXXX}, {nombre:XXXXX,imgepath:XXXXX,precio:XXXXX,ciudades:{ XXXXX },tags:{ XXXXX },descripcion: XXXXX} } 

我想添加许多对象,例如第一个对象也许是一个电话,第二个电视…等我不能添加任何东西,我用这个:

 mongoose.model('Usuarios').update({ productos:[{$pushAll:{ nombre: informacion.pNombre, imgPath: informacion.pImagen, precio: informacion.pPrecio, ciudades: informacion.pCiudades, tags: informacion.pTags, descripcion: informacion.pDescripcion }},{upsert:true}] }); 

但它不工作! 我可以编辑nombre apellido电子邮件…等,但我不能与productos。

这里的问题是使用.update()方法,你想要使用的实际操作符是$push

update方法将第一个参数作为查询来查找要更新的文档,第二个参数是实际的更新语句。 所以在你的情况下:

 mongoose.model('Usuarios').update( { /* query to match document(s) */ }, { "$push": { nombre: informacion.pNombre, imgPath: informacion.pImagen, precio: informacion.pPrecio, ciudades: informacion.pCiudades, tags: informacion.pTags, descripcion: informacion.pDescripcion } }, { upsert:true }, function(err,numAffected) { } ); 

如果您的“查询”条件实际上不匹配集合中的任何文档,则您为upsert设置的“选项”将创build一个“新”文档。

如果您的目的不是更新多个文档,那么您的使用可能更适合.findOneAndUpdate().findByIdAndUpdate()方法。

注意, $pushAll操作符在MongoDB的最新版本中已经被弃用了,最好的方法是使用$each修饰符和$push 。 这是因为这个function也以同样的方式与$addToSet操作符共享。 预期用途是一次添加“多个”数组项目。

你需要为'productos'定义单独的模式,并通过引用将它们存储在'esquemaUsuarios'中,当你需要共享相同的产品时,它会给你更多的灵活性和节省数据库的存储空间