セイル 0.10.x と mongoDB を使用して、単純な 1 対多の関連付けを作成しようとしています。ゲームとマップの 2 つのモデルがあり、ゲームにはアカウントに複数のマップを関連付けることができます。populate を使用すると、ゲームに関連付けられたすべてのマップを正しく取得できますが、逆の操作は機能しません。populate from Map を使用してゲーム データを取得できません。
ここに私のモデルがあります:
//Game.js
module.exports = {
attributes: {
name:{
type: 'string',
required: true
},
maps: {
collection: 'map',
via: 'game'
}
}
//Map.js
module.exports = {
attributes: {
name: {
type: 'string',
required: true
},
game:{
model: 'game'
}
}
//test data:
Game.create({
id: 200,
name: 'game1'});
Map.create({
id: 300,
name: 'map1',
game: 200
});
私が使用する場合
Game.find().populate("maps").exec(console.log);
ゲームに関連付けられたマップを正しく返します。
{ maps:
[ { name: 'map1',
game: '200',
id: '300' } ],
name: 'game1'}
しかし、マップからゲーム データを取得しようとする逆コマンドは、未定義のゲーム プロパティを返します。
Map.find().populate("game").exec(console.log)
戻り値:
{ name: 'map1',
game: undefined,
id: '300' }
find() でパラメーターを使用しようとしても、同じ結果が得られました。
Sails と waterline のドキュメントでコードを再確認しましたが、何が間違っているのかわかりませんでした。
帆のドキュメント: http://sailsjs.org/#/documentation/concepts/ORM/Associations/OnetoMany.html
ウォーターライン ドキュメント: https://github.com/balderdashy/waterline-docs/blob/master/associations.md
アップデート
必要な ID を強制せずにテスト データを作成すると、完全に機能することがわかりました。
Game.create({name: 'game1'}).exec(console.log);
Game.findOne({name: 'game1'}, function (err, game){
Map.create({
name: 'map1',
game: game.id
}).exec(console.log);
});
これで、所有者データを取得できます。mongoDB ID を使用すると機能するので、コネクタに関連する問題だと思います。
Map.find().populate("game").exec(console.log)
//returns (ommited the original IDs
[ { game:
{ name: 'game1', id: 'xxx100' },
name: 'map1',
id: 'xxx300' } ]
ありがとう!