在Mongo中使用唯一键创建seenMessages对象

时间:2019-02-15 17:59:18

标签: mongodb

我对Mongo并不了解,所以请在此无知!

我想向每个用户添加一个seeedMessages对象,以确定该用户已读取或不读取哪些消息,这取决于消息的唯一ID的存在(或不存在),类似于:

//键入用户对象

seenMessages: {
  i3d4Fh87: 'i3d4Fh87',
  hfy7FDE9: 'hfy7FDE9',
}

该想法是检查该键的对象,如果找不到该消息,则认为该消息“看不见”。查看该消息后,该消息ID将被添加到seenMessages对象中,此时将被视为“可见”。

在Mongo中有没有办法实现这一目标?即在更新阶段,以及只是将字段创建为空对象,Schema.Types.Mixed似乎都会生成一个包含null的数组。

2 个答案:

答案 0 :(得分:1)

我会使用数组而不是对象来存储消息。 Mongo有大量operators that work on arrays,添加multikey index将使这些操作迅速

  • 要添加一条看不见的消息,您可以执行类似db.myColl.update(query, {$addToSet: "seenMessages": messageId}})的操作(只要命名字段不存在,mongo会将其创建为数组)
  • 要将邮件标记为已读,请使用$ pull-https://docs.mongodb.com/manual/reference/operator/update/pull/
  • 如果您要查询未曾看到消息的用户,则可以在user.seenMessages上建立索引以使查询更加快捷

我知道这并不能完全回答最初的问题,但是在对象中使用任意键是mongo没有很好的工具来支持的模式。有关更多详细信息,请参见MongoDB Query Help - query on values of any key in a sub-object

答案 1 :(得分:1)

他是正确的,如果我有代表笑,我会投票支持他。如果您通过对象来完成此操作,则可以在@willis帖子的最后一个链接中的方法中进行操作,但是在数组上使用findOne并在读取ID时将其推入会更容易,该值将不会例如,在checkIfRead: {type: Array}中,直到使用findOneAndUpdate方法将其放置在此处为止。如果findOne因为不存在而没有结果,您可以输入任何想要的逻辑。