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

更新期间如何处理mongodb中索引字段中的值?,mongodb,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 } ] 正如你所看到的,我在封面

我有一个像这样的收藏:

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,我找不到足够的文档。

具体地说,您的文档中似乎有一个字段包含指向集合或数据库中另一个字段的链接。而且,您关心的似乎是,如果引用的文档从您的收藏中删除,该怎么办

由于MongoDB本身并没有像关系数据库那样维护引用完整性的概念,因此如何维护此类信息取决于您自己

如果要从
cover
字段中删除对文档的引用,可以将其设置为
null
,如图所示,也可以使用以完全删除该字段

我会选择$unset方法,并结合给定的用例。使用sparse选项,索引中将仅包含该字段的文档。单独考虑大小,意味着索引大小更小,并且在
封面
信息是搜索关键的情况下,也应该提供更好的性能

在任何一种情况下,您都可能希望在发布时将其包装在您的逻辑中,并相应地包装“相关”文档

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

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

我并不困惑。我说的正是我想说的。你似乎对这个问题感到困惑。你想得不对。请再读一遍,如果你需要更多的澄清,请告诉我。谢谢你。@kheya我误读了你问题中的一两行。大部分内容仍然适用,在索引表单上有一个编辑注释可供使用。