提问者:小点点

在Mongo中创建具有唯一键的seenMessages对象


我不太熟悉蒙戈,所以请原谅我的无知!

我想为每个用户添加一个seenMessages对象,以确定用户是否阅读了哪些消息,这取决于消息唯一ID的存在(或不存在),类似于:

//用户对象中的键

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

这个想法是检查该键的对象,如果无法定位,则将消息视为“未看到”。查看消息后,消息ID将被添加到seenMessages对象中,此时它将被视为“看到”。

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


共2个答案

匿名用户

我会使用数组来存储消息而不是对象。Mongo有大量处理数组的运算符,添加多键索引将使这些操作更快

  • 要添加看不见的消息,您可以执行db. myColl.update(query,{$addToSet:"seenMessages":message ageId}})(只要命名字段不存在,mongo将其创建为数组)
  • 要将消息标记为已读,您可以使用$la--https://docs.mongodb.com/manual/reference/operator/update/pull/
  • 如果你想查询没有看到消息的用户,你可以在user. seenMessages上有一个索引来使查询变得快捷

我知道这并不能完全回答最初的问题,但是在对象中使用任意键是一种模式,mongo没有很好的工具来支持。有关更多详细信息,请参阅MongoDB查询帮助-对子对象中任何键的值进行查询

匿名用户

他是对的,如果我有代表,我会投他的票。如果你用对象来完成这个,你可以在@wilis帖子的最后一个链接中的方法中完成,但是在数组上使用findOne并在读取时推高id会更容易,例如,值不会在checkIfRead:{type: Array}中,直到它与findOneAndUpdate方法放在那里。如果findOne因为不存在而没有结果,你可以放入任何你想要的逻辑。