如何使用mongo db解决唯一索引中的缺失值?

Mon*_*key 8 mongodb

mongo文档声明"当文档保存到具有唯一索引的集合时,任何丢失的索引键都将插入空值.因此,将无法插入缺少相同索引键的多个文档."

那么在可选字段上创建唯一索引是不可能的吗?我应该用userId创建一个复合索引来解决这个问题吗?在我的特定情况下,我有一个具有可选嵌入式oauth对象的用户集合.例如

>db.users.ensureIndex( { "name":1, "oauthConnections.provider" : 1, "oauthConnections.providerId" : 1 } );
Run Code Online (Sandbox Code Playgroud)

我的示例用户

{  name: "Bob"
   ,pwd: "myPwd"
   ,oauthConnections [
      {
         "provider":"Facebook",
         "providerId" : "12345",
         "key":"blah"
      }
     ,{
         "provider":"Twitter",
         "providerId" : "67890",
         "key":"foo"
      }
     ]
}
Run Code Online (Sandbox Code Playgroud)

mne*_*syn 11

我相信这是可能的:您可以拥有一个稀疏且唯一的索引.这样,不存在的值永远不会进入索引,因此它们不能重复.

警告:复合索引无法做到这一点.我不太确定你的问题.您引用了涉及复合索引的文档的一部分 - 那里将插入缺失值,但是从您的问题我猜你不是在寻找具有复合索引的解决方案?

这是一个示例:

> db.Test.insert({"myId" : "1234", "string": "foo"});
> show collections
Test
system.indexes
>
> db.Test.find();
{ "_id" : ObjectId("4e56e5260c191958ad9c7cb1"), "myId" : "1234", "string" : "foo" }
>

> db.Test.ensureIndex({"myId" : 1}, {sparse: true, unique: true});
>
> db.Test.insert({"myId" : "1234", "string": "Bla"});
E11000 duplicate key error index: test.Test.$myId_1  dup key: { : "1234" }
>
> db.Test.insert({"string": "Foo"});
> db.Test.insert({"string": "Bar"});
> db.Test.find();
{ "_id" : ObjectId("4e56e5260c191958ad9c7cb1"), "myId" : "1234", "string" : "foo" }
{ "_id" : ObjectId("4e56e5c30c191958ad9c7cb4"), "string" : "Foo" }
{ "_id" : ObjectId("4e56e5c70c191958ad9c7cb5"), "string" : "Bar" }
Run Code Online (Sandbox Code Playgroud)

另请注意,复合索引不能稀疏