私は、 "ユーザ"の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は同じ問題を抱えていますが、文字列を使って "解決"しました。これは私の問題の反対です。