使用索引查询 MongoDb 的自定义键和值

Querying MongoDb's custom key & value with Index

我正在尝试将键值数据存储在 MongoDb 中。 Key 可以是任何字符串,在存储之前我对此一无所知,value 可以是任何类型(整数、字符串、数组) .我想在这样的 key & value.

上建立索引

我正在查看我的 key-vals 数组上的 (Multikey Index),但看起来它无法涵盖对数组字段的查询。

是否可以在 mongoDb 中的自定义 key & value 上建立索引并使用此类操作进行查询因为 $exists and $eq and $gte, $lte, $and, $or, $in 没有 COLLSCAN 但通过 IXSCAN 阶段? 或者也许我需要另一个数据库?

如果你的key可以是任意值,那么这是不可能的。最好的办法是在其他已知字段上创建索引以限制初始结果,以便将不可避免的集合扫描的影响降至最低。

我可能误解了你的问题,但我认为这正是 MongoDB 的优势所在 - 处理不同形状的文档和数据类型。

假设您必须遵循两个文档:

db.test.insertMany([
    {
        key: "test",
        value: [ "some array", 1 ]
    },
    {
        key: 12.7,
        values: "foo"
    }
])

然后您创建一个 compound 索引,如下所示:

db.test.createIndex({
    "key": 1,
    "value": 1
})

那么以下查询将使用该索引:

db.test.find({ "key": "test", "value": 1 })

更复杂的查询也会执行相同的操作:

db.test.find({ "key": { $exists: true }, "value": { gt: 0 } })

您可以通过在上述查询的末尾添加 .explain() 来验证这一点。

根据您的评论更新:

您不需要聚合框架。你可以简单地做这样的事情:

db.test.distinct("user_id", { "key": { $exists: true } })

此查询将使用上述索引。此外,通过更改索引定义以包含 "user_id" 字段,它可以变得更快:

db.test.createIndex({
    "key" : 1.0,
    "value" : 1.0,
    "user_id" : 1
})

同样,这可以通过 运行 以下查询来验证:

db.test.explain().distinct("user_id", { "key": { $exists: true } })