当前位置: 首页 > 知识库问答 >
问题:

FireStore:如何在强制执行唯一字段值的同时插入带有自动id的文档?

薛承志
2023-03-14
const query = firestore.collection(`/fruits`).where("name", "==", "banana").limit(1);

await firestore.runTransaction(async transaction => {
    const querySnapshot = await transaction.get(query);
    if (querySnapshot.length == 0) {
        const newRef = firestore.collection(`/fruits`).doc();
        await transaction.create(newRef, { name: "banana" });
    }
});
const hash = computeHash("banana");
const uniqueIndexRef = firestore.doc(`/fruitsNameUniqueIndex/${hash}`);

try {
    await firestore.runTransaction(async transaction => {
        transaction.create(uniqueIndexRef, {});

        const newRef = firestore.collection(`/fruits`).doc();
        transaction.create(newRef, { name: "banana" });
    });
} catch (error) {
    console.log("fruit not inserted", error.message);
}

共有1个答案

欧阳乐生
2023-03-14

newRef保证不会被使用吗?

它实际上保证是唯一的。两个随机生成的文档ID的可能性非常小。

另见:

    null
 类似资料:
  • 问题内容: 这似乎很简单:我想在SQLite表中复制一行: 如果没有显式的唯一列声明,则该语句将起作用,但是将声明表的第一列。有什么方法可以创建一个简单的语句,而上面的语句在不知道表模式的情况下起作用(除了第一列)? 问题答案: 好吧,由于无法按照我想要的方式执行此操作,因此我使用了隐式行ID,该ID与我显式定义的rowId列的名称相同,因此现在可以使用问题中使用的查询了。 ,它将使用新的rowI

  • 问题内容: 我有以下SQLite代码。如何在每行中插入自动生成的唯一ID? 问题答案: 您可以将其定义为自动递增列: 正如MichaelDorner指出的那样,SQLite文档说an可以做同样的事情,并且速度稍快。该类型的列是其别名,其行为类似于自动增量列。 此行为是隐式的,可能会使经验不足的SQLite开发人员措手不及。

  • 问题内容: 我定义了一个MySQL表: 我在这里阅读到MySQL不支持带条件的。对于每个 customerId, 我们只有一个 primaryImage = 1 。 那么我还能采取什么措施来强制执行此约束? 问题答案: 完美支持独特的约束。 但是,它不支持部分约束/索引,因此您需要使用而不是标记非主图像。 您可以将任意数量的值插入到每个客户中,但只能插入一个非空值。

  • 我有一个名为“posts”的Firebase Firestore集合,其结构如下: 我可以查询所有类别为“general”的博客文章,如:然而,我似乎无法找到一种方法来获取“类别”映射为空的所有文档。 我想查询“帖子”集合中的所有文档,其中有。我尝试了,但没有成功。我将如何获取这些数据?

  • 尝试使用我已经使用的自动完成功能,使用以下映射 分析:过滤器:placename\u ngram:max\u gram=15,min\u gram=2,type=edge\u ngram分析器:索引:过滤器:小写,placename\u ngram,标记器:关键字placename\u搜索:过滤器:小写:标记器关键字 这对于前面的类型非常有用,但是当我试图找到像“包含在”这样的值时,它不会返回记录

  • 问题内容: 在MySQL中,我试图复制一排的 自动增量 和 插入 数据到同一个表的新行。 如何在单个查询中执行此操作? 问题答案: 用途: 除以外的所有列都在哪里?如果要显式插入2,则将其包括在INSERT列列表和SELECT中: 当然,在第二种情况下,您必须注意2 的可能重复项。