我正在尝试将文档保存在我的集合中,如果保存成功,则返回此文档的_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]
});
答案 0 :(得分:2)
您不必在架构中提供_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);
}
}
}
});
重要的是,保存不会返回您必须使用自己创建的奖杯。