2017-06-24 8 views
0

私は、 "ユーザ"のIDSである "協力者"のリストを持つ "プロジェクト"を持つノード/エクスプレス/マングース(最新バージョン)アプリケーションを書いています。今までは、外部キーのリストを16進文字列として保存していました。これにより、やや複雑な集約を行うのが難しくなりましたので、代わりにObjectId型として格納することにしました。これにより、結合が簡単になりました。

配列を作成する関数では、push(userId)バージョンがうまく動作し、コラボレータを配列に追加します。しかし配列にObjectIdがを押して、またはのObjectIdが 『協力者.. $ conditionalHandlers』に

「ドル($)接頭辞フィールド 『$ conditionalHandlers』で失敗含む配列を割り当てると、ストレージには有効ではありません。 "

function addCollaborator(projectId, userId, fn){ 
    projectModel.findById(projectId, (err, project)=>{ 
     if(err) return fn(err); 

     project.collaborators.push(new Schema.Types.ObjectId(userId)); // errors 
     // project.collaborators = [ new Schema.Types.ObjectId(userId) ]; // errors 
     // project.collaborators.push(userId); // works 

     project.save((err)=>{ 
      logService.error('Error adding collaborator to project: '+err.toString()); 
     }); 
     fn(null); 
    }); 
} 

プロジェクトモデル:テキストIDを持つ

const ProjectSchema = new mongoose.Schema({ 
     name: String, 
     create_date: Date, 
     administrators: Array,   // list of user._id 
     collaborators: Array,   // list of user._id ObjectIds 
    }); 

、私は次のように見ているプロジェクトを取得:

{ "_id" : ObjectId("594e2222a26ca3505c18c674"), 
"name" : "Pips 2nd Project", "create_date" : ISODate("2017-06-24T08:26:10.498Z"), 
"collaborators" : [ "5936a3576d6c5a3ef4ee0936" ], 
"administrators" : [ "594dbba8186f1a2f5ad7539c" ], "__v" : 1 } 

それが壊れたとき、私はエラーを記録し、が残っています空の配列:

{ "_id" : ObjectId("594e278b6a68a2815b043bd1"), 
"name" : "Pips third Project", "create_date" : ISODate("2017-06-24T08:49:15.091Z"), 
"collaborators" : [ ], 
"administrators" : [ "594dbba8186f1a2f5ad7539c" ], "__v" : 0 } 
私が達成したい何

は次のとおりです。

{ "_id" : ObjectId("594e2222a26ca3505c18c674"), 
"name" : "Pips 2nd Project", "create_date" : ISODate("2017-06-24T08:26:10.498Z"), 
"collaborators" : [ Object("5936a3576d6c5a3ef4ee0936") ], 
"administrators" : [ "594dbba8186f1a2f5ad7539c" ], "__v" : 1 } 

私はSOのか、githubの問題いくつかの他のを見てきましたが、どれも問題を説明するように見えるん。 This oneは同じ問題を抱えていますが、文字列を使って "解決"しました。これは私の問題の反対です。

答えて

0

他の投稿(e.g.)を読んだ後、私は間違った方法を使って16進文字列からObjectIdを作成していることに気付きました。

new Schema.Types.ObjectId(userId) // not right! 

は次のようになります。

mongoose.Types.ObjectId(userId) 

今期待通りだから、これは動作します:

project.collaborators.push(mongoose.Types.ObjectId(userId)); 

と生産:

{ "_id" : ObjectId("594e278b6a68a2815b043bd1"), 
"name" : "Pips third Project", "create_date" : ISODate("2017-06-24T08:49:15.091Z"), 
"collaborators" : [ ObjectId("5936a3576d6c5a3ef4ee0936") ], 
"administrators" : [ "594dbba8186f1a2f5ad7539c" ], "__v" : 1 } 
関連する問題