开发者

Node.js & Mongoose, can't recover _id

开发者 https://www.devze.com 2023-03-24 14:32 出处:网络
I\'m trying to save a document in my collection and if the save is successful, return the _id of this same document. The problem is I get an undefined value to my _id in both case, either the created

I'm trying to save a document in my collection and if the save is successful, return the _id of this same document. The problem is I get an undefined value to my _id in both case, either the created model from mongoose or from the callback return. Basically, my only way of getting the _id would be to search the document by one of its properties, and then get the value. This approach isnt what I want, knowing what im currently trying to do should work.

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');
          }
        });
      }
    });
    }  
  });
});

The Schema

 var Trophy = new Schema({
        _id             : ObjectId,
        name            : String,
        accessCode      : String,
        description     : String,
        //reference to User ID
        members         : [Number],
        comments        :[Comment]
    });


you don't have to supply _id in your Schema, it'll be generated automatically. and if you want the name to be unique you can also configure this in the Schema. if members are supposed to be "real" user _ids, than try sth like [ObjectId].

var TrophySchema = new Schema({
  name: {type:String, required:true, unique:true},
  accessCode: String,
  description: String,
  //reference to User ID
  members: [ObjectId],
  comments: [Comment]
});

and i don't know if this works

var trophy = new Trophy({...data...});

like you did it, i always do it like this:

var trophy = new Trophy();
trophy.name = "my name";
// ...

and the _id should be set as soon as you create the object (http://stackoverflow.com/questions/6074245/node-mongoose-get-last-inserted-id).

so just do it this way:

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

important is, that save doesn't return the trophy you have to use the one you created yourself.

0

精彩评论

暂无评论...
验证码 换一张
取 消