Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在MongoDB中创建新文档时,如何确保某些字段的唯一性?_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 在MongoDB中创建新文档时,如何确保某些字段的唯一性?

Node.js 在MongoDB中创建新文档时,如何确保某些字段的唯一性?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我想使用唯一的复合索引来强制文档中某些字段的唯一性 使用mongoose时,有两种创建索引的方法: 通过重启MongoDB 通过调用Model.ensureIndex() 那 当应用程序启动时,Mongoose会自动启动 为架构中的每个已定义索引调用createIndex。 […] 虽然对于开发来说不错,但建议在生产中禁用此行为,因为创建索引可能会导致错误 而且,每次向集合中添加新文档时重新启动数据库似乎并不是真正的“高效” 创建索引的第二种方法也是如此: 不建议您在生产环境中运行此操作。索引

我想使用唯一的复合索引来强制文档中某些字段的唯一性

使用mongoose时,有两种创建索引的方法:

  • 通过重启MongoDB
  • 通过调用
    Model.ensureIndex()
  • 当应用程序启动时,Mongoose会自动启动 为架构中的每个已定义索引调用createIndex。
    […]
    虽然对于开发来说不错,但建议在生产中禁用此行为,因为创建索引可能会导致错误

    而且,每次向集合中添加新文档时重新启动数据库似乎并不是真正的“高效”


    创建索引的第二种方法也是如此:

    不建议您在生产环境中运行此操作。索引创建可能会影响数据库性能,具体取决于您的负载。小心使用。

    要将此问题扩展到特定示例,请执行以下操作:

    对于每个文档,两个特定字段的组合应该是唯一的(例如“年”和“课程”),因此我使用的是唯一的复合索引。
    在保存新文档后,可能会有第二个具有相同值的请求触发错误,因为它是重复的。
    如果尚未创建索引,文档仍将保存。 因此,它是关于(正如标题试图强调的)确保独特性。也许使用索引并在每次保存新文档时重建索引不是正确的方法;我对其他选择持开放态度

    那么,我们应该如何确保独特性呢

    来自文档:

    MongoDB持久化索引,因此,如果您是从一个新的数据库开始,或者您运行了db.dropDatabase(),则只需要重新生成索引

    创建索引后,MongoDB将使其保持最新。因此,在添加新文档时,我们不需要手动重建索引

    启动时,我们可以等待新索引准备就绪:

    Model.init().then(function() {
        // indexes are ready here
        Model.create([{ name: 'Val' }, { name: 'Val' }], function(err) {
        });
    });
    
    还要记住:

    在生产环境中,您应该[使用MongoDB shell创建索引](),而不是依赖mongoose来为您创建索引

    从文档:

    MongoDB持久化索引,因此,如果您是从一个新的数据库开始,或者您运行了db.dropDatabase(),则只需要重新生成索引

    创建索引后,MongoDB将使其保持最新。因此,在添加新文档时,我们不需要手动重建索引

    启动时,我们可以等待新索引准备就绪:

    Model.init().then(function() {
        // indexes are ready here
        Model.create([{ name: 'Val' }, { name: 'Val' }], function(err) {
        });
    });
    
    还要记住:

    在生产环境中,您应该[使用MongoDB shell创建索引](),而不是依赖mongoose来为您创建索引


    看起来像是复制品:@Igor那不是复制品。您提到的问题是关于使用索引时查询速度的提高。当然,在这种情况下,不必重建索引。但看看这个问题:这个问题是关于如何确保独特性的。如果在添加其他文档时未重建索引,则在尝试保存重复项时不会引发错误。看起来像是重复项:@Igor这不是重复项。您提到的问题是关于使用索引时查询速度的提高。当然,在这种情况下,不必重建索引。但看看这个问题:这个问题是关于如何确保独特性的。如果在添加另一个文档时未重建索引,则在尝试保存重复项时不会引发错误。那么您对此有何解释?当然,它们是持久的,但是:
    但是,如果您等待使用模型生成索引。在('index')事件上,尝试保存重复项将正确出错。
    它们需要时间来生成。如果在构建期间,有另一个具有相同值的保存请求,该怎么办?会有一个副本。我想防止这种重复。在这个例子中,我们不是在等待建立索引,因此,流程将是:1)我们有一个没有索引的新数据库2)初始化mongoose并开始由mongoDB在后台构建索引3)当索引还没有准备好时立即调用create>成功4)索引已经准备好如何防止重复引用文章中提到的我在您的答案下面的第一条评论中提到的内容?我们也如果在部署应用程序时只讨论新的索引,则不会经常添加索引。如果你想确保所有的索引都在那里,你必须等到所有的模型都被初始化(
    Model.init()
    在每个模型上解析)之后才能启动你的应用程序。但这是一种不同寻常的策略……或者,正如mongoose文档中建议的那样,您应该首先使用MongoDB shell构建索引,然后部署依赖于该索引的应用程序。在这种情况下,你会确信一切都如预期的那样。那么你对此有何解释?当然,它们是持久的,但是:
    但是,如果您等待使用模型生成索引。在('index')事件上,尝试保存重复项将正确出错。
    它们需要时间来生成。如果在构建期间,有另一个具有相同值的保存请求,该怎么办?会有一个副本。我想防止这种重复。在这个例子中,我们不是在等待建立索引,因此,流程将是:1)我们有一个没有索引的新数据库2)初始化mongoose并开始由mongoDB在后台构建索引3)当索引还没有准备好时立即调用create>成功4)索引已经准备好如何防止重复引用文章中提到的我在您的答案下面的第一条评论中提到的内容?我们也如果在部署应用程序时只讨论新的索引,则不会经常添加索引。如果你想确保所有的索引都在那里,你必须等到所有的模型都被初始化(
    Model.init()
    在每个模型上解析)之后才能启动你的应用程序。但这是不寻常的策略……或者,正如猫鼬文档中建议的那样,您应该构建