在MongoDB索引中,选项" safe"和"强迫"意思?

时间:2015-07-16 20:53:55

标签: mongodb

我正在使用collection.getIndexes()查看我们的Mongo(2.4.10)索引。我看到在我能找到的任何文档中都没有讨论的选项。具体来说,我看到了选项" safe"和"强迫"。例如下面:

{
    "v" : 1,
    "name" : "status_1",
    "key" : {
        "status" : NumberLong(1)
    },
    "ns" : "db.mycoll",
    "force" : true,
    "background" : true
},

做什么"强迫"和"安全"意思?

1 个答案:

答案 0 :(得分:1)

您提到的选项("强制"和#34;安全")不是MongoDB 2.4的有效索引选项。

他们可能是因为开发人员意外地确保索引包含这些索引作为索引选项(可能是为了将这些字段作为索引标准的一部分?)。

您可以在mongo shell中重现此结果:

> db.foo.ensureIndex({foo: true}, {force: true, safe: true})
{
    "createdCollectionAutomatically" : true,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

> db.foo.getIndexes()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "stack.foo"
    },
    {
        "v" : 1,
        "key" : {
            "foo" : true
        },
        "name" : "foo_true",
        "ns" : "stack.foo",
        "force" : true,
        "safe" : true
    }
]
>

将忽略未知的索引选项(至少在MongoDB 3.0中),因此虽然这令人困惑,但目前的影响是良性的。不幸的是,删除无效选项的唯一方法是删除&重建受影响的索引,因为changing an existing index没有API。

可能会在未来的MongoDB版本中添加索引选项验证,但应将此注释为发行说明中的​​兼容性更改。例如,MongoDB 2.6有几个index changes,包括更好的字段名称验证和索引密钥长度的强制执行。