我在节点应用程序中使用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 };
}
};
2条答案
按热度按时间iqjalb3h1#
我认为使用URL作为ID是可以的,特别是如果这是你查找文档的主要方式,并且你不需要在以后更改URL。是的,ID通常是数字或UUID,但没有理由你必须被限制在这一点上。
但是,您可以采用的另一种方法是使用SQL查询(从技术上讲是SQL ++,因为这是JSON数据库)。
比如:
你还需要一个索引,类似于:
我建议您查看有关使用Node.js编写SQL ++查询(有时仍称为"N1QL")的文档:https://docs.couchbase.com/nodejs-sdk/current/howtos/n1ql-queries-with-sdk.html
下面是文档中的第一个例子:
vyswwuz22#
您可以散列文档的url属性(使用sha-1),并使用散列结果代替文档的uuid。
{“url”:“www.google.com“,“其他属性”:“某个值”,}meta.id()=
2LmfaLIItUU7ORywxsPWqYJPPDo=
{“url”:“www.yahoo.com“,“其他属性”:“某个值”,}meta.id()=
okmivkemZi3lnnpr4B1Xc2z/d0g=
根据我的经验,我不喜欢使用n1 ql和查询引擎,因为它们的成本和复杂性都很高(使用N1 QL很简单,但效率不高)。