Javascript 如何使用mongoose在不同文档中保存JSON中的对象?
我有以下疑问。我有以下资料: JSON 用户模式Javascript 如何使用mongoose在不同文档中保存JSON中的对象?,javascript,node.js,express,mongoose,Javascript,Node.js,Express,Mongoose,我有以下疑问。我有以下资料: JSON 用户模式 _group:{ type: mongoose.Schema.Types.ObjectId, ref: 'Group' }, name: { type: String }, age: { type: Number } 我需要使用nodejs/mongoose在不同的文档中保存或更新这些数据。我计划做以下几件事 var data=JSON.parse(JSON) 对于(var i=data.length-1;i>=0;i--){ 变量名称=数据[
_group:{
type: mongoose.Schema.Types.ObjectId,
ref: 'Group'
},
name: {
type: String
},
age: {
type: Number
}
我需要使用nodejs/mongoose在不同的文档中保存或更新这些数据。我计划做以下几件事
var data=JSON.parse(JSON)
对于(var i=data.length-1;i>=0;i--){
变量名称=数据[i]。名称;
var age=数据[i]。年龄;
用户。查找({名称):PAR,“x组”:GROPGIID},(Err,用户)={
如果(错误)
下一个(错误);
//如果不存在,则创建新单据
如果(uu.isEmpty(doc)){
var newuser=新用户;
newuser.name=名称;
newuser.age=年龄;
newuser.save((错误,已保存)=>{
})
}//如果存在,请更新它
否则,如果(!\u.isEmpty(doc)){
user.age=年龄;
user.save((错误,已保存)=>{
})
}
})
}
正如您将看到的,User.find中的变量age和name仍然未定义,因此这对我不起作用
首先,这是保存这些数据的正确方法吗?如果是这样,我如何在User.find中使用for循环变量(名称和年龄)?如果没有,你建议我做什么
谢谢,
爱德华多
NodeJS、ExpressJS、Mongoose如果您很好地解析了给定的JSON,并将值分配给
name
和age
,则它们在用户中不是未定义的
。查找范围
你检查过那些变量了吗
var name = data[i].name;
var age = data[i].age;
您可以通过选项{upsert:true}
使用mongoose
。
这会尝试更新数据库中的对象,如果找不到该对象,则会创建该对象。因此:
for (var i = data.length - 1; i >= 0; i--) {
var name = data[i].name;
var age = data[i].age;
User.findOneAndUpdate({'name': par, '_group': group_id}, { name, age }, { upsert: true, new: true, lean: true }, (err, updated) => {
if(err) console.log(err);
else console.log(updated);
})
}
选项new
指示返回更新的对象,选项lean
指示返回普通JSON,而不是Mongoosedocument
对象(与调用doc.toJson()相同)使用upsert选项,可以使用findOneAndUpdate()作为查找和upsert操作。如果upsert找到与筛选器匹配的文档,则其行为与普通findOneAndUpdate()类似。但是,若并没有文档匹配过滤器,MongoDB将通过组合过滤器和更新插入一个,如下所示
data.forEach( user => {
User.findOneAndUpdate({'name': user.name , '_group': group_id}, user , {upsert: true, new: true}, (err, data) => {
if(err) console.log(err);
console.log(data);
})
})
还有一个问题,我认为您正在面临,您正在循环中调用一个方法,它需要回调,因此它不会在这里等待返回并移动到第二次迭代,因此您可能会遇到未定义的和一些不期望的行为
我建议您使用async/await
let user = await User.findOneAndUpdate({'name': par, '_group': group_id}, { name, age }, { upsert: true })
谢谢,现在我使用async/wait来代替回调。
let user = await User.findOneAndUpdate({'name': par, '_group': group_id}, { name, age }, { upsert: true })