使用索引查询 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 } })
我正在尝试将键值数据存储在 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 } })