用于插入的自定义Mongo ObjectId

时间:2012-11-27 14:47:31

标签: mongodb mongoid elasticsearch mongodb-.net-driver

一些背景:

我通过mongo-elasticsearch河与ElasticSearch一起使用MongoDB。在Elasticsearch中,我希望我的文档结构如下所示:

{
    "_id": "SomeId-AnotherId",

    ... // all the other lovely denormalized data
}

SomeId-AnotherId是我在对数据进行非规范化时创建的。我需要这种结构的原因是我需要能够说http://elasticsearch/index/type/SomeId-AnotherId来检索文档。

我对我的数据进行了非规范化(一个C#应用程序),然后我插入到MongoDB中(这些数据然后通过河流进入ES,如上所述)。当我插入MongoDB时,我目前的印象是我需要在我的模型上设置一个BsonId,Mongo用它来索引文档。这可以是ObjectId或任何其他类型,如string或int等,只要我添加[BsonId]属性。

我的模型看起来像这样:

public class Model {
    [BsonId]
    public string Id {get;set;}
}

我这样设置:

model.Id = string.format("{0}-{1}", someId, anotherId);

问题

目前我看到大约1,500个文件从〜10,000的插入进入Mongo。我看了一下我为模型对象生成的id,肯定有超过12个字节。 mongo会拒绝那些而不是写它们吗?

Bson Id是12字节 - 这是否意味着如果我创建自己的ID(格式为:“SomeId-AnotherId”),它也应该只有12个字节长?无论如何围绕这个?

我不想对这些文档使用mongos默认的objectId,因为正如我上面提到的,一旦doc在elasticsearch中,我希望能够以特定的方式获取文档(在一个文档中使用“SomeId-AnotherId”) URI)。

最终备注:

我知道我可以在我的模型中添加另一个ID属性,例如ElasticId,然后配置Elasticsearch来查找此属性并将其用作elasticsearch文档的_id。如果我这样做,那么我可以使用Mongos默认ID,一切都会好的。但是,我会牺牲弹性搜索性能,我还需要在弹性搜索中存储一个我不想要的额外字段。

对不起大规模的脑转储顺便说一下!! :)

2 个答案:

答案 0 :(得分:9)

MongoDB文档_id字段可以是12字节的UUID,但不是必须的。根据{{​​3}},您可以将任何非数组值用作_id,只要您可以确保它是唯一的。

答案 1 :(得分:4)

好的,我现在已经解决了这个问题。经过反思,这有点显而易见,对我来说是一次大规模的疏忽。

我正在批量插入10,000个,但记录总数超过4000万。我的ID保证在每批次中是唯一的 - 因此在其他批次中可能存在重复。

我打开了SafeMode,开始看到我遇到的异常 - 他们来自mongo,他们是重复的关键异常。我发现mongo csharp客户端一旦出现重复键错误就会丢弃批处理中的所有剩余数据。所以我看到一批批次的第一批1500,然后我收到一个重复的密钥错误,然后没有插入批次的其余部分。这完全有道理。

所以现在我正在进行单个插入,实际上几乎和批量插入一样快。当我收到重复的密钥错误时,我会记录它但继续操作,因为我不关心我的方案中的重复项。

感谢@Philipp的帮助。