我正在尝试将文档保存到我的集合中,如果保存成功,则返回同一文档的 _id。问题是在这两种情况下,我的 _id 都得到了一个未定义的值,无论是从 mongoose 创建的模型还是从回调返回。基本上,我获取 _id 的唯一方法是通过其属性之一搜索文档,然后获取值。这种方法不是我想要的,知道我目前正在尝试做的事情应该可行。
var createTrophy = new Trophy({
name : post.name,
accessCode : post.password,
description : post.description,
members : [id]
});
Trophy.findOne({name:post.name}, function(err, trophy) {
if(err){
console.log('Mongoose: Error: ' + err);
res.send('Error db query -> ' + err);
}
else if(trophy){
console.log('Trophy ' + trophy.name + ' already existant');
res.send('Trophy ' + trophy.name + ' already existant');
}else{
createTrophy.save(function(err, doc){
var uid = createTrophy._id;
if (err) {
console.log('Error in trophy saving:' + err);
res.send('Error in trophy saving:' + err);
}else{
User.findOne({_id:post.id}, function(err, user) {
if(err){
console.log('Mongoose: Error: ' + err);
res.send('Error db query -> ' + err);
}
else if(user){
console.log(doc._id + ' ' + uid);
user.trophyLink = doc._id;
res.send(user);
//user.save(function(err){
// if(err){res.send('Couldnt update trophy of profile');}
//});
}
else{
console.log('User id Inexistant');
res.send('User id Inexistant');
}
});
}
});
}
});
});
架构
var Trophy = new Schema({
_id : ObjectId,
name : String,
accessCode : String,
description : String,
//reference to User ID
members : [Number],
comments :[Comment]
});
最佳答案
您不必在架构中提供 _id
,它会自动生成。如果您希望名称是唯一的,您也可以在 Schema 中配置它。如果 members
应该是“真实的”用户 _id,那么请尝试像 [ObjectId]
这样的东西。
var TrophySchema = new Schema({
name: {type:String, required:true, unique:true},
accessCode: String,
description: String,
//reference to User ID
members: [ObjectId],
comments: [Comment]
});
不知道能不能用
var trophy = new Trophy({...data...});
就像你做的那样,我总是这样做:
var trophy = new Trophy();
trophy.name = "my name";
// ...
_id
应该在您创建对象后立即设置 (http://stackoverflow.com/questions/6074245/node-mongoose-get-last-inserted-id)。
就这样吧:
trophy.save(function (err) {
if (err) {
if (err.toString().indexOf('duplicate key error index') !== -1) {
// check for duplicate name error ...
}
else {
// other errors
}
res.send('Error in trophy saving:' + err);
}
else {
User.findOne({_id:post.id}, function(err2, user) {
if (err2) {/* ... */}
else if (user) {
user.trophyLink = trophy._id;
res.send(user);
}
}
}
});
重要的是,保存不会返回您必须使用自己创建的奖杯。
关于javascript - Node.js 和 Mongoose,无法恢复 _id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6920619/