2017-02-27 17 views
1

すべてのサブ文書のためのObjectIdを作成しない:マングース自己参照されるスキーマは、このように、私は自己参照されたフィールドを持っているマングースでスキーマを持っている

var mongoose = require('mongoose'); 

var CollectPointSchema = new mongoose.Schema({ 
    name: {type: String}, 
    collectPoints: [ this ] 
}); 

CollectPointオブジェクトが挿入されたとき:

{ 
    "name": "Level 1" 
} 

それは大丈夫だ期待のように、結果は次のとおりです。

{ 
    "_id": "58b36c83b7134680367b2547", 
    "name": "Level 1", 
    "collectPoints": [] 
} 

しかし、私は自己参照サブドキュメンタリーを挿入したとき子供CollectPointSchema_idどこにあるの

{ 
    "_id": "58b36c83b7134680367b2547", 
    "name": "Level 1", 
    "collectPoints": [{ 
    "name": "Level 1.1" 
    }] 
} 

:メントは、

{ 
    "name": "Level 1", 
    "collectPoints": [{ 
    "name": "Level 1.1" 
    }] 
} 

これは私に与えますか?私はこれが必要_id。あなたの埋め込まれたCollectPoint項目宣言するときは、新しいオブジェクトを構築する必要があり

+0

私は[この再帰関数](https://gist.github.com/GSchutz/100358d4a614b563da29e72c5f8cd5e9)でこの問題を解決します。 – Guilherme

答えて

1

_idcollectPointsがそうでなければCollectPointのインスタンス化によって作成されます

var data = new CollectPoint({ 
    name: "Level 1", 
    collectPoints: [ 
     new CollectPoint({ 
      name: "Level 1.1", 
      collectPoints: [] 
     }) 
    ] 
}); 

この方法は、あなただけのプレーンなJSONObjectを作成しています。

var data = new CollectPoint({ 
    name: "Level 1", 
    collectPoints: [{ 
     name: "Level 1.1", 
     collectPoints: [] 
    }] 
}); 
:次のエラーがトリガされます

var CollectPointSchema = new mongoose.Schema({ 
    name: { type: String }, 
    collectPoints: { 
     type: [this], 
     validate: { 
      validator: function(v) { 
       if (!Array.isArray(v)) return false 
       for (var i = 0; i < v.length; i++) { 
        if (!(v[i] instanceof CollectPoint)) { 
         return false; 
        } 
       } 
       return true; 
      }, 
      message: 'bad collect point format' 
     } 
    } 
}); 

この方法:

は、そのアイテムが間違った型を持っている場合は、エラーがトリガされますあなたのアレイの validatorを構築し、問題のこれらの種類を回避するために、
+0

ありがとう、あなたの答えは、私が留意しなかったモンゴセの基本的な概念をクリアしました。しかし、私は 'collectPoints:[this]'を追加すると 'new ..()'を強制するか、またはこの関係がモデル内になければならないと思うのは奇妙です(残念ながら、 – Guilherme

関連する問題