NodeJS 选择文件的方法

6yt4nkrj  于 2023-03-01  发布在  Node.js
关注(0)|答案(2)|浏览(145)

我在节点应用程序中使用Couchbase。每次插入文档时,我都使用随机UUID。它插入良好,我可以基于此ID检索数据。
但在现实中,我实际上想通过文档中一个叫url的键来搜索。才能获得或更新或删除一个文档。
我可能会添加url作为id,但这不是我在任何数据库概念中看到的。
或任何唯一的名称。它们通常是随机数或增量数。
我该如何处理这个问题,以便可以使用随机UUID作为id,但能够通过url进行搜索?
因为让我们说的id是56475-asdf-7856,我不会知道这个值搜索的权利。
然而,如果id是https://www.example.com,我知道这个网址,搜索它会给予我我想要的。
把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 };
  }
};
iqjalb3h

iqjalb3h1#

我认为使用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)
  }
}
vyswwuz2

vyswwuz22#

您可以散列文档的url属性(使用sha-1),并使用散列结果代替文档的uuid。
{“url”:“www.google.com“,“其他属性”:“某个值”,}meta.id()= 2LmfaLIItUU7ORywxsPWqYJPPDo=
{“url”:“www.yahoo.com“,“其他属性”:“某个值”,}meta.id()= okmivkemZi3lnnpr4B1Xc2z/d0g=
根据我的经验,我不喜欢使用n1 ql和查询引擎,因为它们的成本和复杂性都很高(使用N1 QL很简单,但效率不高)。

相关问题