NodeJS GCP数据存储节点库:包含长字符串数组的对象的正确格式?

4dc9hkyq  于 2023-02-03  发布在  Node.js
关注(0)|答案(1)|浏览(111)

我有一个如下形式的JavaScript对象:

const data = {
  title: "short string",
  descriptions: [
    "Really long string...",
    "Really long string..."
  ]
}

长字符串需要从索引中排除,而且,不管出于什么原因,我不知道对象需要什么格式来保存它:

const entityToSave = dataToDatastore(data);

datastore.save({
  key: datastore.key(["TestEntity"]),
  data: entityToSave
})

我只需要知道entityToSave应该是什么样子的,我试过20种不同的形状,每次尝试使用excludeFromIndexes时,要么抛出一个错误,说字符串太大,要么最终成为一个实体类型而不是数组类型。
我可以让它通过GCP管理界面工作,所以我觉得我疯了。
编辑:为了方便起见,我包含了一个脚本,只要您(1)设置PROJECT_ID和(2)向descriptions数组添加适当长度的字符串,该脚本就应该运行。

const { Datastore } = require("@google-cloud/datastore");

const PROJECT_ID = null;

const data = {
  title: "short string",
  descriptions: [
    "Really long string...",
    "Really long string...",
  ]
}

const entityToSave = dataToDatastore(data);

async function save() {
  const datastore = new Datastore({
    projectId: PROJECT_ID,
  });

  console.log(entityToSave);

  const entity = {
    key: datastore.key(["TestEntity"]),
    data: entityToSave
  };

  datastore.save(entity);
}

function dataToDatastore(data) {
  return data
}

save();

我只需要知道dataToDatastore应该是什么样子,我已经根据四五个不同地方的文档和讨论尝试了许多变体,但没有一个成功。

qojgxg4l

qojgxg4l1#

您必须将excludeFromIndexes: true应用于数组中超过1500字节限制的所有实体。

const data = {
  title: "short string",
  descriptions: [
    "Really long string...",//> 1500 bytes
    "Really long string...", //> 1500 bytes
  ]
}

下面是entityToSave的外观

const entityToSave = data.descriptions.map(description => ({
    value: description,
    excludeFromIndexes: true
  }));
console.log(entityToSave);

// this will transform data.descriptions to 
// [
//   { value: 'Really long string...', excludeFromIndexes: true },
//   { value: 'Really long string...', excludeFromIndexes: true }
// ]

Which will apply `excludeFromIndexes: true` to all entities 

//Then save the entity
datastore.save({
  key: datastore.key(["TestEntity"]),
  data: entityToSave
})

有关详细信息,请查看此github issuestackoverflow thread

相关问题