web-dev-qa-db-ja.com

マングースに住むとはどういう意味ですか?

populateの例に関連する情報を提供するチュートリアルはたくさんありますが、その意味を正確に説明するチュートリアルはありませんが、理解できない次のコード行に遭遇しました。ここに例があります

var mongoose = require('mongoose'), Schema = mongoose.Schema

var PersonSchema = new Schema({
  name    : String,
  age     : Number,
  stories : [{ type: Schema.ObjectId, ref: 'Story' }]
});

var StorySchema = new Schema({
  _creator : {
     type: Schema.ObjectId,
     ref: 'Person'
  },
  title    : String,
  fans     : [{ type: Schema.ObjectId, ref: 'Person' }]
});

var Story  = mongoose.model('Story', StorySchema);
var Person = mongoose.model('Person', PersonSchema);
Story.findOne({ title: /Nintendo/i }).populate('_creator') .exec(function (err, story) {
if (err) ..
  console.log('The creator is %s', story._creator.name);
  // prints "The creator is Aaron"
})
11
Sai Ram

populate() function is mongooseは、参照内のデータを入力するために使用されます。あなたの例では、StorySchemaには__creator_フィールドがあり、これは基本的にmongodbドキュメントのObjectId byである__id_フィールドを参照します。

populate()関数は、文字列またはオブジェクトを入力として受け入れることができます。

Stringは、入力する必要があるフィールド名です。あなたの場合、それは__creator_です。マングースがmongodbから1つのドキュメントを見つけた後、その結果は以下のようになります

__creator: {
  name: "SomeName",
  age: SomeNumber,
  stories: [Set Of ObjectIDs of documents in stories collection in mongodb]
},
title: "SomeTitle",
fans: [Set of ObjectIDs of documents in persons collection in mongodb]
_

populateは、オブジェクトを入力として受け入れることもできます。

Mongooseのpopulate()関数のドキュメントは以下にあります。 http://mongoosejs.com/docs/2.7.x/docs/populate.html

7
Akhil P

私はランダムにその質問に出くわしましたが、それが古い方法であったとしても、それが説明されている方法に納得していないので、私はここで助ける必要があると感じています:

Populate()関数に値を入力...

それはネイティブの英語を話す人にとっては非常に明確かもしれませんが、他の人にとってはそうではないかもしれません。

TL; DR

Populateは、ドキュメント内の指定されたパスを他のコレクションのドキュメントで自動的に置き換えます

ロングバージョン

あなたの例を見てみましょう

Story.findOne({ title: Nintendo })

そのようなストーリーを返します:

{
  _creator : A0jfdSMmEJj*9, //id of the creator (totaly random, just for a clear example)
    title    : Nintendo,
    fans     : [r432i900fds09809n, fdsjifdsjfueu88] // again, totaly random that i've typed here
  }
}

場合によっては、作成者やファンを気にしないので、このような要求で十分な場合があります。そのため、IDがあってもそれほど問題にはなりません。

しかし、その作成者が必要な場合は、データベースでそれを見つけるために別のリクエストを行う必要があります。ただし、ここのmongooseでは、populate()と呼ばれる巧妙な関数があり、追加のリクエストを明示的に行わずに、回答の情報を直接取得するために、前のリクエストにチェーンできます。

Story.findOne({ title: Nintendo }).populate('_creator')

戻ります

{
  _creator : {
       _id : A0jfdSMmEJj*9,
       name: Sai,
       age: 100,
       stories : [fdsfdsfdsew38u, 89hr3232, ...]
    },
    title    : Nintendo,
    fans     : [r432i900fds09809n, fdsjifdsjfueu88]
  }
}

しかし、多分、それは多すぎる情報であり、私たちは彼が書いた物語と彼の年齢と名前で十分ではありません。その後、Populateは、必要なフィールドを含む他の引数を取ることができます

Story.findOne({ title: Nintendo }).populate('_creator', 'name age')

結果==>

{
  _creator : {
       name: Sai,
       age: 100,
    },
    title    : Nintendo,
    fans     : [r432i900fds09809n, fdsjifdsjfueu88]
  }
}
28
sound