วิธีนับจำนวนที่ยังไม่ได้อ่าน

ฉันสร้างสคีมาข้อความของฉันดังต่อไปนี้:-

{ 
_id : message_unique_id,
recipients : [ user_id1,user_id2,user_id3 ],
message : "Hello Word",
readBy : [user_id2,user_id3],
chatId : unique_id_for_every_chat
}

ตอนนี้ฉันสามารถรับข้อความสุดท้ายของแต่ละการสนทนาได้ แต่ไม่สามารถนับจำนวนข้อความที่ยังไม่ได้อ่านได้ สิ่งที่ฉันใช้มีดังนี้:-

Messages.aggregate([
{ $match : {recipients : {$in : [my_user_id]},
{ $project : {
chatId : 1,
recipients : 1,
readBy : 1
}, { $group : {
_id : "$chatId",
message : "$last" : "$message"} }}]).exec();

ข้อความค้นหาข้างต้นใช้งานได้ดีและส่งคืนข้อความสุดท้ายของแต่ละแชทที่ผู้ใช้ทำ แต่ตอนนี้ฉันต้องการนับข้อความที่ยังไม่ได้อ่านด้วย ฉันใช้แบบสอบถามต่อไปนี้: -

Messages.aggregate([
    { $match : {recipients : {$in : [my_user_id]},
    { $project : {
    chatId : 1,
    recipients : 1,
    readBy : 1,
    unread: {  
            $cond: { if : { "$readBy" : {$in : [my_user_id]}}, then : 
            0, else : 1 }
        }
    }, 
    { $group : {
          _id : "$chatId",
           unreadCount : { $sum: "$unread" },   
           message : "$last" : "$message"} }}]).exec();

แต่แบบสอบถามนี้ส่งคืนค่าว่าง กรุณาช่วย.


person gourav sarswa    schedule 18.10.2019    source แหล่งที่มา


คำตอบ (1)


แทนที่ค่าการอ่าน $project ด้วยด้านล่าง:

 unread: {$cond: {
            if: {$gte: [{$indexOfArray: ["$readBy", my_user_id]}, 0]}, then: 0, else: 1
         }}

พยายาม

 unread: {
        $cond: {
          if: {
            "$setIsSubset": [
              [my_user_id],
              "$readBy"
            ]
          },
          then: 0,
          else: 1
        }
      }

สิ่งนี้ใช้ได้ในกรณีของฉัน

person sushant mehta    schedule 18.10.2019
comment
มันให้ข้อผิดพลาด. MongoError : ตัวดำเนินการไม่ถูกต้อง '$indexOfArray. - person gourav sarswa; 18.10.2019
comment
ฉันคิดว่าฉันต้องอัปเกรดเวอร์ชันเพื่อใช้สิ่งนี้ ขณะนี้เวอร์ชันคือ 3.2.22 - person gourav sarswa; 18.10.2019
comment
ฉันได้เพิ่มรหัสใหม่ที่มี $in คงที่ คุณลองได้ไหม - person sushant mehta; 18.10.2019