[node.js] 저장 후 몽구스 채우기

새로 저장된 개체의 작성자 필드를 수동 또는 자동으로 채울 수 없습니다. 내가 찾을 수있는 유일한 방법은 내가 이미 가지고있는 개체를 다시 쿼리하는 것입니다.

이것은 설정입니다.

var userSchema = new mongoose.Schema({
  name: String,
});
var User = db.model('User', userSchema);

var bookSchema = new mongoose.Schema({
  _creator: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
  description: String,
});
var Book = db.model('Book', bookSchema);

여기가 제가 머리를 당기는 곳입니다

var user = new User();
user.save(function(err) {
    var book = new Book({
        _creator: user,
    });
    book.save(function(err){
        console.log(book._creator); // is just an object id
        book._creator = user; // still only attaches the object id due to Mongoose magic
        console.log(book._creator); // Again: is just an object id
        // I really want book._creator to be a user without having to go back to the db ... any suggestions?
    });
});

편집 : 최신 몽구스 가이 문제를 해결하고 채우기 기능을 추가했습니다. 새로운 답변을 참조하십시오.



답변

이렇게하려면 모델의 채우기 기능을 사용할 수 있어야합니다. http://mongoosejs.com/docs/api.html#model_Model.populate 책의 저장 처리기에서 다음 대신

book._creator = user;

당신은 다음과 같이 할 것입니다.

Book.populate(book, {path:"_creator"}, function(err, book) { ... });

당신을 돕기에는 너무 늦었을 것입니다. 그러나 나는 최근에 이것에 매달 렸고 다른 사람들에게 유용 할 것입니다.


답변

누군가가 여전히 이것을 찾고 있다면.

Mongoose 3.6은 다음과 같은 많은 멋진 기능을 도입했습니다.

book.populate('_creator', function(err) {
 console.log(book._creator);
});

또는:

Book.populate(book, '_creator', function(err) {
 console.log(book._creator);
});

https://github.com/LearnBoost/mongoose/wiki/3.6-Release-Notes#population 에서 자세히보기

그러나 이렇게하면 사용자를 다시 쿼리 할 수 ​​있습니다.

추가 쿼리없이이를 수행하는 약간의 트릭은 다음과 같습니다.

book = book.toObject();
book._creator = user;


답변

나를 위해이 솔루션은 사용하는 것이었다 execPopulate과 같이,

const t = new MyModel(value)
return t.save().then(t => t.populate('my-path').execPopulate())


답변

프라 미스를 반환하는 솔루션 (콜백 없음) :

Document # populate 사용

book.populate('creator').execPopulate();

// summary
doc.populate(options);               // not executed
doc.populate(options).execPopulate() // executed, returns promise

가능한 구현

var populatedDoc = doc.populate(options).execPopulate();
var populatedDoc.then(doc => {
   ...
});

여기에서 문서 채우기에 대해 읽어보십시오 .


답변

정교하게 설명하고 다른 예를 들었습니다. 이것은 저장 후 부분적으로 채워진 개체를 검색하려는 사용자에게 도움이 될 수 있습니다. 방법도 약간 다릅니다. 올바른 방법을 찾기 위해 한두 시간 이상을 보냈습니다.

  post.save(function(err) {
    if (err) {
      return res.json(500, {
        error: 'Cannot save the post'
      });
    }
    post.populate('group', 'name').populate({
      path: 'wallUser',
      select: 'name picture'
    }, function(err, doc) {
      res.json(doc);
    });
  });


답변

나는 나처럼 완전한 멍청이를 위해 일을 명확히하기 위해 이것에 추가 할 것이라고 생각했습니다.

주의하지 않으면 엄청나게 혼란스러운 것은 세 가지 매우 다른 채우기 방법이 있다는 것입니다. 이들은 서로 다른 객체 (모델 대 문서)의 메소드이며, 서로 다른 입력을 취하고 서로 다른 출력을 제공합니다 (문서 대 약속).

당황한 사람들을위한 것입니다.

Document.prototype.populate ()

전체 문서를 참조하십시오.

이것은 문서에서 작동하고 문서를 반환합니다. 원래 예에서는 다음과 같습니다.

book.save(function(err, book) {
    book.populate('_creator', function(err, book) {
        // Do something
    })
});

문서에서 작동하고 문서를 반환하므로 다음과 같이 연결할 수 있습니다.

book.save(function(err, book) {
    book
    .populate('_creator')
    .populate('/* Some other ObjectID field */', function(err, book) {
        // Do something
    })
});

하지만 저처럼 어리석지 말고 이렇게하세요.

book.save(function(err, book) {
    book
    .populate('_creator')
    .populate('/* Some other ObjectID field */')
    .then(function(book) {
        // Do something
    })
});

기억하세요 : Document.prototype.populate ()는 문서를 반환하므로 말도 안됩니다. 약속을 원한다면 …

Document.prototype.execPopulate ()

전체 문서를 참조하십시오.

이것은 문서에서 작동하지만 문서를 해결하는 약속을 반환합니다. 즉, 다음과 같이 사용할 수 있습니다.

book.save(function(err, book) {
    book
    .populate('_creator')
    .populate('/* Some other ObjectID field */')
    .execPopulate()
    .then(function(book) {
        // Do something
    })
});

그게 낫다. 마지막으로 …

Model.populate ()

전체 문서를 참조하십시오.

이것은 모델에서 작동 하고 약속을 반환합니다. 따라서 약간 다르게 사용됩니다.

book.save(function(err, book) {
    Book // Book not book
    .populate(book, { path: '_creator'})
    .then(function(book) {
        // Do something
    })
});

다른 신규 이민자들에게 도움이 되었기를 바랍니다.


답변

불행히도 이것은 아직 해결되지 않은 몽구스의 오랜 문제입니다.

https://github.com/LearnBoost/mongoose/issues/570

당신이 할 수있는 일은 당신 자신의 사용자 정의 getter / setter를 작성하는 것입니다 (그리고 별도의 속성에 real _customer 을 설정 하십시오). 예를 들면 :

var get_creator = function(val) {
    if (this.hasOwnProperty( "__creator" )) {
        return this.__creator;
    }
    return val;
};
var set_creator = function(val) {
    this.__creator = val;
    return val;
};
var bookSchema = new mongoose.Schema({
  _creator: {
     type: mongoose.Schema.Types.ObjectId,
     ref: 'User',
     get: get_creator,
     set: set_creator
  },
  description: String,
});

참고 : 나는 그것을 테스트하지 않았고 .populate순수 ID를 설정할 때 이상하게 작동 할 수 있습니다 .