如何在更新期间处理mongodb中的索引字段中的值?

时间:2014-02-09 02:05:33

标签: mongodb

我有一个看起来像这样的集合:

Book
[
{
  _id:ObjectId(1),
  cover: ObjectId(5),
  title: ABC,
  author: Bob
},
{
  _id:ObjectId(2),
  cover: ObjectId(5),
  title: EFG,
  author: John
},
{
  _id:ObjectId(3),
  cover: null,
  title: XYZ,
  author: Mike
}
]

正如您所看到的,我在封面字段上有索引。这个索引只有封面字段

我的问题是 - 用户可能会从某些文档中删除该字段值。

目前我正在将这些字段的值设置为null。

我担心该字段有很多空值,因为我有一个索引。

我是否应该从这些文件中完全删除该字段($ unset)?

由于我的收藏可能会变大,所以不确定哪一个更适合表现。

我无法通过搜索Google找到足够的文档。

1 个答案:

答案 0 :(得分:0)

具体来说,您似乎在谈论在文档中包含一个Manual Reference字段到集合或数据库中的另一个字段。如果从您的集合中删除引用的文档,您的担忧似乎是该怎么做。

由于MongoDB本身没有关系数据库维护参照完整性的概念,因此您如何维护此类信息取决于您。

如果您想从cover字段中删除对该文档的引用,您可以将其设置为null,如您所示,或者使用$unset完全删除该字段。

考虑到用例,我会采用$ unset方法和sparse index。使用稀疏选项,只有包含该字段的文档才会位于索引中。仅考虑尺寸因素意味着索引尺寸较小,并且在cover信息是搜索的关键字时也应提供更好的性能。

在任何一种情况下,您可能希望在发出remove时将其包含在逻辑中,并相应地update“相关”文档。

db.collection.remove({ _id: <ObjectId> });
db.collection.update(
    { cover: <ObjectId> },{ $unset: { cover: "" } },
    { upsert: false, multi: true }
)

选项会导致所有文档中的更新与查询匹配。