2017-06-05 39 views
1

用Googleデータストア1500バイトのプロパティ制限はによれば、埋め込まれたエンティティにexcludeFromIndexes: true設定https://cloud.google.com/datastore/docs/concepts/entities#embedded_entity埋め込みエンティティ

が索引付けされるから、その特性の両方を削除する必要があり、したがって、その埋め込まれたエンティティの特性が大きいことを可能にするべきです1500バイトを超える

私は1500バイトより長いいくつかの性質を持っていると私はエラーを取得しています組み込みエンティティ記述しようとしています

“Error: The value of property “additionalAttributes” is longer than 1500 bytes. at /node_modules/grpc/src/node/src/client.js:434:17"

私はexcludeFromIndexes: trueを設定(およびIてるにもかかわらずを組み込みエンティティ上で埋め込みエンティティがインデックスなしで正しく追加されていることをクラウドコンソールで確認できます)。

私はそこに既知の問題があります:https://github.com/GoogleCloudPlatform/google-cloud-node/issues/1916です。修正または回避策としては何も表示されませんが、

どのような問題が発生しているか、どのように修正するのか/回避策については何か提案がありますか?

答えて

1

回避策は、少なくとも1500バイトをサポートする必要があるプロパティに対しては、excludeFromIndexes=trueを設定することです。埋め込みエンティティのJSONは以下のようになります。 excludeFromIndexesを明示的に設定しているtextプロパティに注意してください。

{ 
    "properties": { 
    "date": { 
     "timestampValue": "2017-06-05T18:53:23.106Z" 
    }, 
    "text": { 
     "stringValue": "long text that exceeds 1500 bytes", 
     "excludeFromIndexes": true 
    } 
    } 
} 
+0

私の問題は埋め込みプロパティの大きなプロパティです。埋め込みエンティティのプロパティに 'excludeFromIndexes:true'を配置することはできません。もしできれば、どうすればいいですか? –

+0

私の例は確かですGCDコンソールからエンベデッドエンティティを削除します。私はJava APIを使用しました。これは、(トップレベルまたはネストされた)すべてのプロパティを除外するのにかなり簡単です。 NodeJSにあまり慣れていない。 –

0

を介した固定バージョンは次のとおりです。 false}を返します。メソッドentity.entityToEntityProtoは、プロパティがDatastoreに送信される前に呼び出されますが、entity.dataがObjectの場合にのみ呼び出されます(配列を渡すことも可能です)。

このスクリプトはノード内の任意の場所に含めることができます。データストアが開始される前に配置することができます。 entity.entityToEntityProtoメソッドを上書きします。

const INCLUDE_ATTRIBUTES = ['_index','_audit','_unique']; 

function entitySetIndexes(properties, path){ 
    for(let key in properties){ 
     let keypath = (path ? path+'.' : '') + key 
      , prop = properties[key]; 

     if(prop.entityValue) 
      entitySetIndexes(prop.entityValue.properties, keypath); 
     else if(prop.arrayValue) 
      prop.arrayValue.values.forEach(item=>{ 
       if(item.entityValue) 
        entitySetIndexes(item.entityValue.properties, keypath) 
      }); 

     // excludeFromIndex cannot be set on arrays, they're always indexed 
     if(!prop.arrayValue) 
      prop.excludeFromIndexes = INCLUDE_ATTRIBUTES.indexOf(keypath) === -1; 
    } 
} 

const entity = require('@google-cloud/datastore/src/entity.js') 
    , entityToEntityProto = entity.entityToEntityProto; 
entity.entityToEntityProto = function(entityObject){ 
    entityObject = entityToEntityProto(entityObject); 
    entitySetIndexes(entityObject.properties); 
    return entityObject; 
} 

{data:{attribute: 'value'}、key:...}でエンティティを保存してください。ディープアトリビュートをインデックス化する場合は、ドットで区切って指定し、配列は無視します。 私は@ google-cloud/datastore v1.1.0のスクリプトを使用しています。

関連する問題