Node.js&猫鼬,无法恢复_id

时间:2011-08-03 01:10:08

标签: javascript mongodb node.js mongoose

我正在尝试将文档保存在我的集合中,如果保存成功,则返回此文档的_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]
    });

1 个答案:

答案 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);
      }
    }
  }
});

重要的是,保存不会返回您必须使用自己创建的奖杯。