选择文件的方法

问题描述 投票:0回答:2

我在节点应用程序中使用 Couchbase。每次插入文档时,我都使用随机 UUID。 它插入得很好,我可以根据这个 id 检索数据。

但实际上,我其实是想在文档中通过一个叫url的key来搜索。能够获取或更新或删除文档。

我可能会添加 url 作为我想的 id,但这不是我在任何数据库概念中看到的。 IDs 不是 urls

或任何独特的名称。它们通常是随机数或增量数。

我如何处理这个问题,以便我可以使用随机 UUID 作为 id 但能够通过 url 进行搜索?

因为假设 id 是 56475-asdf-7856,我不会知道这个值来搜索正确的。

而如果 id 是 https://www.example.com 我知道这个 url 并搜索它会给我我想要的东西。

将 url 设为 id 是个好主意吗?

这是在使用 Couchbase 的节点应用程序中。

databaseRouter.put('/update/:id', (req, res) => {
  updateDocument(req)
    .then(({ document, error }) => {
      if (error) {
        res.status(404).send(error);
      }
      res.json(document);
    })
    .catch(error => res.status(500).send(error));
});

export const updateDocument = async (req) => {
  try {
    const result = await collection.get(req.params.id); // Feels like id should be the way to do this, but doesn't make sense cos I won't know the id beforehand.
    document.url = req.body.url || document.url;
    await collection.replace(req.params.id, document);
    return { document };
  } catch (error) {
    return { error };
  }
};
javascript node.js couchbase
2个回答
2
投票

我认为使用 URL 作为 ID 是可以的,特别是如果这是您查找文档的主要方式,并且您以后不需要更改 URL。是的,很多时候 ID 是数字或 UUID,但没有理由你必须受限于此。

但是,您可以采用的另一种方法是使用 SQL 查询(从技术上讲,SQL++,因为这是一个 JSON 数据库)。

类似的东西:

SELECT d.*
FROM mybucket.myscope.mydocuments d
WHERE d.url = 'http://example.com/foo/baz/bar'

你还需要一个索引,比如:

CREATE INDEX ix_url ON mybucket.myscope.mydocuments (url)

我建议查看使用 Node.js 编写 SQL++ 查询(有时仍称为“N1QL”)的文档:https://docs.couchbase.com/nodejs-sdk/current/howtos/n1ql-queries -with-sdk.html

这是文档中的第一个示例:

async function queryPlaceholders() {
  const query = `
  SELECT airportname, city FROM \`travel-sample\`.inventory.airport
  WHERE city=$1
  `;
  const options = { parameters: ['San Jose'] }

  try {
    let result = await cluster.query(query, options)
    console.log("Result:", result)
    return result
  } catch (error) {
    console.error('Query failed: ', error)
  }
}

0
投票

您可以对文档的 url 属性(使用 sha-1)进行哈希处理,并使用哈希结果代替文档的 uuid。

{ “网址”:“www.google.com”, "otherAttr":"一些值", } meta.id()=

2LmfaLIItUU7ORywxsPWqYJPPDo=

{ “网址”:“www.yahoo.com”, "otherAttr":"一些值", } meta.id()=

okmivkemZi3lnnpr4B1Xc2z/d0g=

根据我的经验,我不喜欢使用 n1ql 和查询引擎,因为它们有很多成本和复杂性(使用 N1QL 很简单但效果不佳)。

© www.soinside.com 2019 - 2024. All rights reserved.