固定的版本我使用此修復程序來設置{excludeFromIndexes:所有屬性遞歸地除外,其中三個除外。 entity.entityToEntityProto方法在屬性發送到Datastore之前被調用,但只有當你的entity.data是一個Object(它也可以傳遞一個Array)時才被調用。
您可以在節點中的任何位置包含此腳本,最好是在數據存儲啓動之前。它將覆蓋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;
}
所以只要確保你保存實體{數據:{屬性: '值'}鍵:...}。如果要爲深層屬性編制索引,請用點分隔它們,忽略數組。 我在@ google-cloud/datastore v1.1.0中使用腳本。
我的問題是嵌入式屬性的一個大特性,afaik你不能在嵌入式實體的屬性上放置'excludeFromIndexes:true'(或者如果可以的話,你會怎麼做?) –
我的例子的確是來自GCD控制檯的嵌入式實體。我使用了非常簡單的Java API來排除任何屬性(頂級或嵌套)。不太熟悉NodeJS。 –