在MongoDB中,我有以下文档
{
"_id": { "$oid" : "4FFD813FE4B0931BDAAB4F01" },
"concepts": {
"blabla": 20,
"blibli": 100,
"blublu": 250,
... (many more here)
}
}
我想索引它以便能够查询“概念”数组的“键”(我知道它不是真正的mongoDB数组......):
db.things.find({concepts:blabla});
上述架构是否可行?或者我应该将我的文件重构为
{
"_id": { "$oid" : "4FFD813FE4B0931BDAAB4F01" },
"concepts": ["blabla","blibli","blublu", ... (many more here)]
}
}
答案 0 :(得分:1)
您可以使用特定查询查询字段状态:
db.your_collection.find({"concept.yourfield": { $exists: true }})
(注意 $ exists )
它将返回yourfield
为concept
子文档字段的所有文档
编辑: 这个解决方案只是关于查询。索引包含的值不是字段。
答案 1 :(得分:1)
我会回答你的实际问题。不能给出当前架构的字段名称索引。 $ exists使用索引,但这只是一个存在检查。
像你正在使用的架构有很多问题,我建议重构:
{
"_id": { "$oid" : "4FFD813FE4B0931BDAAB4F01" },
"concepts": [
{name:"blabla", value: 20},
{name:"blibli", value: 100},
{name:"blublu", value: 250},
... (many more here)
]
}
然后索引{'concepts.name:1'}
,您实际上可以查询概念名称,而不仅仅是检查是否存在。
TL; DR:不,你不能。
答案 2 :(得分:0)
MongoDB索引数组的每个值,以便您可以查询单个项目。您可以找到here。
但是在嵌套数组中,您需要告诉索引mongodb索引您的子字段。
db.col1.ensureIndex({'concepts.blabla':1})
db.col1.ensureIndex({'concepts.blublu':1})
db.col1.find({'concepts.blabla': 20}).explain()
{
"cursor" : "BtreeCursor concepts.blabla_1",
"nscanned" : 1,
"nscannedObjects" : 1,
"n" : 1,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"concepts.blabla" : [
[
20,
20
]
]
}
}
创建索引后,游标类型会从BasicCursor更改为BtreeCursor。
如果您按照问题末尾所述创建文档
{
"_id": { "$oid" : "4FFD813FE4B0931BDAAB4F01" },
"concepts": ["blabla","blibli","blublu", ... (many more here)]
}
}
只需索引即可:
db.col1.ensureIndex({'concepts':1})