我对Mongo并不了解,所以请在此无知!
我想向每个用户添加一个seeedMessages对象,以确定该用户已读取或不读取哪些消息,这取决于消息的唯一ID的存在(或不存在),类似于:
//键入用户对象
seenMessages: {
i3d4Fh87: 'i3d4Fh87',
hfy7FDE9: 'hfy7FDE9',
}
该想法是检查该键的对象,如果找不到该消息,则认为该消息“看不见”。查看该消息后,该消息ID将被添加到seenMessages对象中,此时将被视为“可见”。
在Mongo中有没有办法实现这一目标?即在更新阶段,以及只是将字段创建为空对象,Schema.Types.Mixed似乎都会生成一个包含null的数组。
答案 0 :(得分:1)
我会使用数组而不是对象来存储消息。 Mongo有大量operators that work on arrays,添加multikey index将使这些操作迅速
db.myColl.update(query, {$addToSet: "seenMessages": messageId}})
的操作(只要命名字段不存在,mongo会将其创建为数组)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因为不存在而没有结果,您可以输入任何想要的逻辑。