0

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

3 回答 3

1

您可以使用特定查询查询字段存在:

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

(注意$exists

它将返回您的所有文档,其中子文档yourfield的字段concept

编辑:此解决方案仅与查询有关。索引包含值而不是字段。

于 2012-08-16T10:17:45.837 回答
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:不,你不能。

于 2012-08-16T13:20:25.440 回答
0

MongoDB 索引数组的每个值,因此您可以查询单个项目。您可以在此处找到。

但是在嵌套数组中,您需要告诉索引 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})
于 2012-08-16T10:07:05.350 回答