我正在使用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}
}
我想添加许多对象,例如第一个对象可能是一个celphone,第二个是电视......等等我无法添加任何东西而且我用这个:
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。
答案 0 :(得分:2)
问题在于使用.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
设置的“选项”将创建一个“新”文档。
如果您的目的不是要更新多个文档,那么您的使用可能更适合.findOneAndUpdate()
或.findByIdAndUpdate()
方法。
仅供注释,$pushAll
运算符实际上已在近期版本的MongoDB中弃用,首选方法是将$each
修饰符与$push
结合使用。这是因为此功能也以相同的方式与$addToSet
运算符共享。预期用途是一次添加“多个”数组项。
答案 1 :(得分:0)
imho你需要为'productos'定义单独的模式,并在'esquemaUsuarios'中通过引用存储它们,当你需要共享同一产品时,它将为你提供更大的灵活性并节省数据库存储