在mongodb中为OR查询设置的索引

时间:2014-01-22 07:38:54

标签: mongodb indexing

我的收藏版本代表了应用程序的版本:

{
    application_id: ObjectId(42),
    version: "1.2",
    price: 1.000000
}

在我的数据库中,我已经插入了400k文档,我有10k个新文档(有些可能已经在数据库中,其他没有),我想检索已经插入的所有文档以获取进一步计算的id,以及然后只插入新文档。

**编辑

更确切地说,这是我正在做的算法:

  • 从远程源获取新版本(即10k版本的来源)
  • 从数据库中选择已保存的版本
  • 在我从远程源获取的版本集与已保存的版本之间进行区分,以保存尚未存在于数据库中的版本
  • 插入依赖于版本_id的其他数据(这就是我在插入之前需要选择的原因)。

希望更清楚

**结束编辑

所以我做了一个OR请求:

{
    "$or":[
        {
            "application_id": 12,
            "version": "1.2"
        },
        {
            "application_id": 13,
            "version": "2.6"
        },
        .... for 10k
    ]
}

当我没有索引时,我会在几分钟(5或6)内收到回复,所以我决定设置一个索引来改进它:

db.Version.ensureIndex({"application_id":1,"version":1})

我重新索引集合,但计算时间最差!我在10分钟后停了下来......

所以我的问题是你认为提出OR请求是个好主意,还是应该将其拆分为10k简单请求,如果OR请求是个好主意我的索引有什么问题?

1 个答案:

答案 0 :(得分:2)

男人,10,000 $or你真的需要这么多吗?这必须接近BSON最大尺寸。

您执行查询的方案尚不清楚,因此我目前无法推荐更好的方法。但是,应用程序版本控制通常可以比这更好。

关于你的问题:

  

所以我的问题是你认为提出OR请求是个好主意

可能不是。在这种情况下,MongoDB必须像地狱一样合并,这可能需要花费很长时间。

  

或者我应该将其拆分为10k简单请求,如果OR请求是个好主意我的索引有什么问题?

你的索引看起来应该覆盖,所以这不是问题。

如果您真的必须执行此查询,您可能最好延迟加载页面(我假设网站在这里)和分段查询。 10,000是在很短的时间内发送到服务器的很多查询。

因此,例如,在大约10个版本之后,Github上的版本控制被截断,您必须单击Ajax链接才能获得另外10个版本。