Javascript 如何使用mongoose在不同文档中保存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--){ 变量名称=数据[

我有以下疑问。我有以下资料:

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--){
变量名称=数据[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,而不是Mongoose
document
对象(与调用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 })