0

当每个字段都包含一个数组时,mongodb 不允许在两个字段上创建索引的主要问题:

{a:[1,2], b: [8,9]}

正因为如此,我在尝试解决下一个问题时遇到了困难。

收藏说明

集合名称:项目

  • 每个项目可以属于许多(数千)个文件夹
  • 每个项目都可以被许多(数千)用户阅读。

当前集合结构(简化)

folderDataArr: [{
    _id: 1,
    dateOfAddingIntoFolder: 01.01.11
}, {
    _id: 2,
    dateOfAddingIntoFolder: 01.01.12
}],
userDataArr: [{
    _id: 100,
    isRead: true,
    dateOfRead: 01.0.10

}, {
    _id: 101,
    isRead: true,
    dateOfRead: 01.02.31


}]

查询构建

我需要重新格式化我的结构以进行有效的查询:

  • 返回属于某些文件夹且未被特定用户读取的最后 N 个项目。并且结果应该按将该新闻添加到文件夹的日期排序(换句话说,按“dateOfAddingIntoFolder”字段)。

问题是

如何解决这个问题?

谢谢你的帮助。

4

1 回答 1

0

是的,您必须在 mongodb 中重组您的收藏。由于您包含新实体“新闻项目”并且您的最终输出是未读的新闻项目。我建议以下方式。在此之前,我已经将您的数据可视化如下

usercollection
- user (email id, last logged in time)

NewsCollection
- newsitem (newsid,newsdata,createdtimestamp,updatedtimestamp)

每当新闻项目发生变化时,如创建、更新然后分别更改创建时间戳、更新时间戳

如果用户已登录,请选择旧的登录时间戳(在更新当前时间戳之前)并在 createdtimestamp 或 updatedtimestamp 中选择所有大于旧登录时间戳的新闻项目。

注意:由于新闻项目和用户是独立的实体,因此不建议将它们放在一个集合中。

注意***:由于用户和新闻具有多对多的关系,因此试图提供高用户特定的新闻更新需要更多的文档更新,或者您必须为每个新闻/用户相关的更改操作数组中的更多元素。如果您尝试这样做,请考虑您的应用程序性能。

希望这会对您有所帮助。

于 2013-10-26T19:35:23.430 回答