0

私はmongodbが初めてで、基本的な質問がありますが、問題があります。作成済みのドキュメントの ID フィールドを取得するにはどうすればよいですか? ドキュメントに新しいフィールドを更新/追加できるように、ID が必要です。

//newProfile is an object, one string it holds is called school
if(Schools.find({name: newProfile.school}).fetch().length != 1){
    var school = {
        name: newProfile.school
    }
    Meteor.call('newSchool', school);

    //Method 1 (doesn't work)
    var schoolDoc = Schools.findOne({name: newProfile.school});
    Schools.update({_id: schoolDoc._id}, {$set: {enrolledStudents: Meteor.user()}});

    //Method 2?
    //Schools.update(_id: <what goes here?>, {$push: {enrolledStudents: Meteor.user()}});
}
else {
    //Schools.update... <add users to an existing school>
}

リストされた学校がまだ存在しない場合は、新しい学校のドキュメントを作成します。学校は生徒の配列/リストを保持する必要があります(これは私が問題を抱えている場所です)。新しいフィールド (enrolledStudents と呼ばれる) に学生を追加するにはどうすればよいですか?

ありがとう!

4

3 に答える 3

0

あなたがやろうとしていることについては、 を取得する必要はありません_id。を使用する場合は、クエリで をupdate切り替えるだけです。あなたのコードの残りの部分があなたがやりたいことをすると仮定すると、{_id: schoolDoc._id}使用がうまくいくように見えます。{name: newProfile.school}

_idこれは通常の Mongo ドライバーで動作しますが、Meteor では更新クエリを次のもの以外にすることはできません。Meteor は throwIfSelectorIsNotId 例外をスローします。

まず、正しいドキュメントをプルしていることを確認してください。次のようなことを試すことができます。

var school_id = Schools.findOne({name: newProfile.school})._id;
Schools.update({_id: school_id}, { $push: { enrolledStudents: Meteor.user()}});

それが機能しない場合は、少しデバッグして、特に何が機能していないかを確認する必要があります。

于 2013-11-08T21:18:15.783 に答える
0

あなたがやろうとしていることを正確に理解するのに苦労しています。これまでの私の分析と理解には、いくつかのポインターが挿入されています。

if(Schools.find({name: newProfile.school}).fetch().length != 1){

これはより効率的だろう

if(Schools.find({name: new Profile.school}).count() != 1) {

Meteor.call('newSchool', school);

これが非同期で実行されない限り、ここで何をしているのかわかりません。つまり、このコード ブロックの残りの部分が実行されるまでに、このMeteor.call()関数がサーバー側で完了していない可能性があります。

//Method 1 (doesn't work)
var schoolDoc = Schools.findOne({name: newProfile.school});
Schools.update({_id: schoolDoc._id}, {$set: {enrolledStudents: Meteor.user()}});

コードの先頭にある if ステートメントから判断すると、データベースにはこの名前の学校が複数あります。したがって、schoolDoc変数が目的のレコードであるかどうかはわかりません。

于 2013-11-08T22:01:37.937 に答える