0

ここでいくつかの助けを借りることができます.populateメソッドが期待どおりに機能しない理由がわかりません. 中に人がいる「部屋」をモデル化したいと思います。

var PersonSchema = new Schema({
    _id   : Schema.ObjectId,
    name  : String,
});
var Person = mongoose.model('Person', PersonSchema, 'Person');

var RoomSchema = new Schema({
      _id    : Schema.ObjectId, 
      name : String,
      People : [{ type: Schema.ObjectId, ref: 'Person' }],
});
var Room = mongoose.model('Room', RoomSchema, 'Room');

したがって、1 つのエントリを持つ Person コレクションがあります。

{ 
"name" : "person1", 
"_id" : ObjectId("4f9e5bb68bcd69fb0c000002") 
}

および 1 つのエントリを持つ Room コレクション:

{ 
"_id" : ObjectId("4f9e5bb68bcd69fb0c000001"), 
"name" : "room1", 
"People" : [ ObjectId("4f9e5bb68bcd69fb0c000002") ] 
}

このクエリを実行しようとすると:

Room.findOne({ 'name': 'room1' }).populate('People').run(function (err, result) {
  if(err) console.log(err);
  console.log(result);
});

私は出力として得ます:

{ _id: 4f9e5bb68bcd69fb0c000001,
  name: 'room1',
  People: []
}

Mongoose が people フィールドに入力しないのはなぜですか? 何が間違っているのか理解できません。

4

2 に答える 2

2

この問題は、mongoose の 2.x バージョンのバグでした。修正されました: https://github.com/LearnBoost/mongoose/issues/877

于 2012-05-02T15:23:49.960 に答える
1

マングースはデータを「結合」しないためです(これはあなたがやろうとしていると思います)。

あなたがしたいことは、このようなものです(これはコメントとブログ投稿であることに注意してください)

Schema

var Comments = new Schema({
    title     : String
  , body      : String
  , date      : Date
});

var BlogPost = new Schema({
    author    : ObjectId
  , title     : String
  , body      : String
  , buf       : Buffer
  , date      : Date
  , comments  : [Comments]
  , meta      : {
      votes : Number
    , favs  : Number
  }
});

次に、ブログモデルを作成し、コメントを設定します(例では部屋にいる人)

// retrieve my model
var BlogPost = mongoose.model('BlogPost');

// create a blog post
var post = new BlogPost();

// create a comment
post.comments.push({ title: 'My comment' });

post.save(function (err) {
  if (!err) console.log('Success!');
});

埋め込まれたドキュメントを実行したくない場合は、そのコールバックから検索を実行できます。たとえば、これはツイートの作成者からユーザー名を取得する私のコーヒー スクリプトの例です。

ModelTweets.find {}, (err, tweetResults) ->
    if tweetResults.length == 0
      res.render 'tweets/index', tweets: 0
    else
      # Get the Author for each tweet
      tweetResults.forEach (tweetInfo) ->
        count++
        ModelUser.findOne {'_id': tweetInfo.author}, (err, userInfo) ->
          tweets.push {id: tweetInfo._id, tweet: tweetInfo.tweet, created_at: tweetInfo.created_at, author: userInfo.username}

        if count == tweetResults.length
          res.render 'tweets/index', {tweets: tweets || {}}

それはあなたを正しい軌道に乗せるはずです:)

于 2012-04-30T12:05:15.563 に答える