4

セイル 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' } ] 

ありがとう!

4

2 に答える 2

1

MongoDB を使用していて、デフォルトの Mongo ID を使用したくない場合は、それに応じてモデルを構成する必要があります。例えば:

//Game.js
module.exports = {  
   // Don't use automatic primary key
   autoPK: false,
   attributes: {
    // Create your own ID field manually
     id: {
       type: 'integer',
       primaryKey: true
     },
     name:{
       type: 'string',
       required: true
     },

     maps: {
      collection: 'map',
      via: 'game'
     }

   }
}

これにより、関連付けやその他の操作が正しく機能するようになります。これを行う場合、一意の整数 ID を保証する責任があります。MongoDB には「自動インクリメント」プロパティがありません。

于 2014-09-07T19:45:50.200 に答える
0

必要な 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' 
     } 
 ] 
于 2017-06-06T19:51:44.307 に答える