【发布时间】:2015-05-11 17:55:41
【问题描述】:
我正在搜索很长时间和很多关于这个问题的主题。直到现在我找不到任何解决方案。此外,这对我来说并不完全清楚,希望您能提供帮助。这是我的问题:
我设计了一个 Meteor 应用程序,Mongo DB 中有一个带有订单的集合。该集合通过读取 csv 文件填充
import_file_orders = function(file) {
var lines = file.split('%\r\n');
var l = lines.length - 1;
for (var i=0; i < l; i++) {
var line = lines[i];
var line_parts = line.split('|');
var ex_key = line_parts[0];
var ex_name = line_parts[1];
var clin_info = line_parts[2];
var order_info = line_parts[3];
var clinician_last_name = line_parts[4];
var clinician_first_name = line_parts[5];
var clinician_code = line_parts[6];
var clinician_riziv = line_parts[7]
var pat_id = line_parts[8];
Meteor.orders.insert({Patient:pat_id, Exam_code:ex_key, Exam_name:ex_name, Clinical_info:clin_info, Order_info:order_info, Clinician:{first:clinician_first_name, last:clinician_last_name, c_code:clinician_code, riziv:clinician_riziv}, Planned:null});
console.log("%");
};
}
读取 CSV 文件后,集合中的某些文档有错误:
duplicate key error index: protocolplanner.Orders.$_id_ dup key: { : "2ZGvRfuD8iMvRiXJd" } insert failed
当我运行 Mongo 命令 db.Orders.getIndexes() 时,我看到有两个索引:
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "protocolplanner.Orders"
}
好像有两个索引:一个_id索引(一直存在,不能删除)和一个_id_索引。似乎是 _ id _ 索引导致了错误。所以我有三个问题:
首先:为什么会有 _ id _ 索引?我在 Meteor 代码中没有定义任何索引。 第二:为什么该索引存在 dup key 错误? 第三:似乎我无法删除 _ id _ 索引。为什么?我现在您不能删除 _id 索引,但我认为这不是 _id 索引。
如你所见,我完全迷路了。请帮忙!
编辑:
如下评论,更多信息:
我正在读取的数据量是 10151 行。在定义的客户端读取文件的函数。通过允许和拒绝规则,只有管理员用户可以将数据输入 mongo。这些行被正确读取。读取文件后,应用程序中的所有数据都可用。几秒钟后,Mongo 会自动创建索引并出现错误。从那时起,发生错误的行在应用程序中不再可见。
我在 Mongo shell 中尝试了以下操作: db.Orders.find({_id:"2ZGvRfuD8iMvRiXJd"})
Mongo 给了我正确的文件。这证明 _id 确实是 Meteor 在数据插入数据库时创建的。但是这个 _id 应该是唯一的,所以我对我遇到的错误完全感到困惑。
编辑 2: 经过一些试验和错误,我有一些关于这个问题的新信息。也许知道这很有趣,所以我们可以找到这个问题的答案。
如上所述,当我在客户端读取数据时,即使我使用 ObjecID 而不是 Meteor ID,也会出现重复键错误。但是,当我通过 mongoinsert 命令将数据直接推送到 Mongo 时,所有数据都导入良好,并且没有出现错误。当我插入这么多数据时,似乎服务器和客户端之间存在冲突(可能是异步计时问题)。
目前我正在寻找读取数据服务器端的解决方案,希望不会发生错误。
【问题讨论】:
-
好吧,请不要在这个空间里问“三个问题”,因为格式是“一个问题”,以便与接受的答案相协调。但是,对于 1 和 3,MongoDB 中的
_id字段是“主键”。它被认为是文档本身的“最终唯一标识符”。 MongoDB 本身对如何生成这个“独特”值有自己的概念。 Meteor 选择用它自己的定义来“替换”它。如果您的代码确实如图所示,那么“意图”是“主键”对于创建的每个文档都是唯一的。 -
好的,很抱歉这三个问题。但是,由于主键是唯一的,我不明白为什么会出现重复键错误。
-
如果这是客户端代码而不是在异步上下文中调用,你和我都会。考虑到主键的约束,这里的主要意图是“唯一值”。您也许可以编辑您的问题以包含有关您的操作是客户端还是服务器(猜测服务器)的更多信息。还有您正在处理的数据量。任何生成相同主键值的东西都令人担忧。但是,如果您可以添加更多信息来解释这一点,那将会很有帮助。
-
我正在读取的文件中的行数是 10151。当它们刚刚被读取时,应用程序中的每一行数据都是可用的。几秒钟后,控制台中出现错误(生成索引后)。之后在应用程序中看不到有错误的行。读取文件的函数在客户端定义。当我在 Mongo 控制台中使用查询中的 _id 字段进行搜索时(例如:db.Orders.find({_id:"2ZGvRfuD8iMvRiXJd"})),然后我找到了正确的数据。这证明_id确实是Meteor在插入数据时创建的。通常它应该是唯一的
-
同意唯一的原则。将信息放在问题中比放在评论中更好。您的问题有一个编辑链接。使用它为您添加更多详细信息。