mongodb索引数组的键(不是值)

时间:2012-08-16 09:34:20

标签: mongodb indexing

在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)]
  }
}

3 个答案:

答案 0 :(得分:1)

您可以使用特定查询查询字段状态:

db.your_collection.find({"concept.yourfield": { $exists: true }})

(注意 $ exists

它将返回yourfieldconcept子文档字段的所有文档

编辑: 这个解决方案只是关于查询。索引包含的值不是字段。

答案 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})