简体   繁体   中英

How to form an unordered key with many elements in mongodb

I'm attempting to use mongodb to implement a simple messaging system between two users in mongo. I want to be able to take two users, user0 and user1, and search for their entry in a collection. If the entry for those two users doesn't exist I want to create it and then add the message that was sent to its message field. If it does exist I just want to push the message to the message field.

I'm not really sure the best way to implement this.

db.privateChat.update(
    {between:{$all:['user0', 'user1']}}, 
    {$push:{message:'text'}}, {upsert:true}
)

And other similar entry schemes but they don't work. They produce the error:

"Cannot create base during insert of update. Caused by :ConflictingUpdateOperators Cannot update 'between' and 'between' at the same time"

I can think of other ways to do this producing a symmetric key (where the order of the users don't matter for the purposes of the search) from say adding the hashes together or a query that checks if either messenger0 or messenger1 is either user0 or user1 but these don't seem like great ways of doing it. Is this totally the wrong approach?

Thanks.

I think this could be solved by design. let say that we have document in collection chats;

chat{
_id,
between[arrayOfIds],
startTime,
events[
{message:{
      fromUserId,
      timeStamp,
      data}
}}
]}
}

then messages will be stored in message object inside chat .

App will be aware of chat _id so there will be no issues when you will have a group chat between more than 2 users.

This approach will allow you to prevent overflowing document size limitation as you could start new chat entry every week, day, etc...

Have a fun!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM