0

我有两种实体;

  • 家长
  • 孩子

在上述类型的实体中,子项与父键相关联。

我需要仅基于子密钥过滤孩子,因为我没有父密钥,只有子密钥/ID。

const query = datastore.createQuery('Child')
                       .filter('__key__', '=', datastore.key(['Child', 123]))

奇怪的是,如果我通过一个 ">" 运算符,它将返回记录,但是我需要一个精确的键匹配,以及一个解释。

如果我必须添加一个复合索引,我将如何处理上述关系?

4

2 回答 2

0

正如您在此处看到的那样,您可以这样做,通过添加 limit(1) 确保不会获得多个结果。

const Datastore = require('@google-cloud/datastore');
const datastore = new Datastore({
    projectId: 'cf-datastore',
    keyFilename: 'datastore-credential.json'
});
const kindName = 'user-log';

async  getlog = (req, res) => {
    let uid = req.query.uid || req.body.uid || 0;
    //let log = req.query.log || req.body.log || '';
    const key = datastore.key(['uid','log']);

    datastore
        .get(key,(err, entity) => {});
    const query = datastore.createQuery('uid');
    query.filter('uid', uid);
    query.limit(1);
    const transaction = datastore.transaction();
    console.log("Transaction");
    console.log(transaction);
    const results = datastore.runQuery(query, (err, entities) => {
    // entities = An array of records.

    // Access the Key object for an entity.
        firstEntityKey = entities;
        console.log("Entities")
        console.log(entities);
    });
    console.log("GOT IT");
    console.log("Results")
    console.log(results);
    //console.log("Entity");
    //console.log(entity);
    const task = await datastore.runQuery(query);
    console.log(task);
  //second part
    res.status(200).send(results);
};

exports.executed = (req, res){
  console.log(`  CALLING`);
  getlog(req, res)

  setTimeout(() => {
      resolve('resolved');
    }, 20000);
}

于 2019-10-07T23:47:30.223 回答
0

您如何分配子实体键 ID?如果它使用 allocate id api,则该 API 不保证属于不同父实体的子实体之间的唯一性。结果,即使使用单独的索引,您也无法唯一地查询子项。

一种方法是为顶级实体分配 id,然后将该 id 用作子实体的属性。然后,您可以使用该属性进行查询并获取与其关联的唯一子项。

于 2019-10-03T15:59:42.163 回答