mongodb - 如何使用 mongodb 解决唯一索引中缺失值的问题?

标签 mongodb

mongo 文档指出“当文档保存到具有唯一索引的集合时,任何缺少的索引键都将插入空值。因此,不可能插入缺少相同索引键的多个文档。 ”

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

>db.users.ensureIndex( { "name":1, "oauthConnections.provider" : 1, "oauthConnections.providerId" : 1 } );

我的示例用户<​​/p>

{  name: "Bob"
   ,pwd: "myPwd"
   ,oauthConnections [
      {
         "provider":"Facebook",
         "providerId" : "12345",
         "key":"blah"
      }
     ,{
         "provider":"Twitter",
         "providerId" : "67890",
         "key":"foo"
      }
     ]
}

最佳答案

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

警告:这对于复合索引是不可能的。我不太确定你的问题。您引用了涉及复合索引的文档的一部分——在那里,将插入缺失的值,但从您的问题来看,我猜您不是在寻找带有复合索引的解决方案?

这是一个示例:

> 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" }

另请注意 compound indexes can't be sparse

关于mongodb - 如何使用 mongodb 解决唯一索引中缺失值的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7190654/

相关文章:

python - Flask mongoengine分页

node.js - Mongoose 中的 friend 模式建模?

MongoDB:使用来自同一文档的数据更新文档

mongodb - 在 Mongoose 中进行小时/日/月/年的范围查询

mongodb - 在 MongoDB 中,将帖子的所有评论保存在一个文档中是否可行?

node.js - mongodb查询获取两个日期范围内的文档

javascript - 需要帮助理解 mongodb 聚合 $cond 的 for 循环

node.js - 我在使用 `$unwind` 时获取了数组的分隔文档。如何将它们作为数组获取?

java - Spring Data Mongo - 如何映射继承的 POJO 实体?

mongodb - Golang 从 MongoDB 的嵌套 json 数据映射中找到一个值