javascript - Node.js 和 Mongoose,无法恢复 _i​​d

标签 javascript mongodb node.js mongoose

我正在尝试将文档保存到我的集合中,如果保存成功,则返回同一文档的 _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,无法恢复 _i​​d,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6920619/

相关文章:

使用游标或解释时 MongoDB 聚合崩溃

mongodb - 使用 apt-get 安装 mongodb-10gen 失败

mongodb - MongoError : This MongoDB deployment does not support retryable writes. 请在您的连接字符串中添加 retryWrites=false

node.js - 更新node.js和Electron后node-canvas失败

mysql - 使用带有多个循环的 mysql 在 Node.js 中查询

javascript - 错误 : read ECONNRESET using the request module for mode. js

javascript - Bootstrap Toggle Switch 在页面加载时显示错误内容

javascript - 隐藏动态元素功能。 ('hide')

Javascript:在另一个方法中调用一个方法

javascript - 单独显示信息