我如何使用“ elementMatch” mongodb检索匹配的对象元素的所有嵌套数组

时间:2019-12-02 12:58:42

标签: mongodb mongoose

我们有一个对象数组,每个对象都包含对象“会话”数组。我们需要获取 deliveryStatus 字段已已发送的计数/元素> userId 正在退出

[{
_id: "12312312"
conversation:[
        {
            "messageInformation" : {
                "deliveryStatus" : "sent"

            },
            "userId" : 12
        },
        {
            "messageInformation" : {
                "deliveryStatus" : "sent",
            }

        }
  ]},
_id: "213123123123"
conversation:[
        {
            "messageInformation" : {
                "deliveryStatus" : "sent"

            },
            "userId" : 33
        },
        {
            "messageInformation" : {
                "deliveryStatus" : "sent",
                "userInfo" : [ ]
            }
        }
  ]}
]

我需要总数。我尝试尝试 elemMatch ,但它只返回第一个元素

let counter = await ProjectConversation.find({
conversation: {
        $elemMatch: {
          userId :{$exists: true},
          "messageInformation.deliveryStatus": deliveryStatus.Sent
        }
      }
}, {
      _id: 0,
      conversation.$: 1
    });

如果我得到对象并使用javascript进行计数,那会很好

1 个答案:

答案 0 :(得分:0)

您可以使用aggregate $unwind解构数组,并使用$count计算与$match属性匹配的文档数,例如:

db.collection.aggregate([{
        $unwind: "$conversation"
    },
    {
        $match: {
            "conversation.messageInformation.deliveryStatus": "sent",
            "conversation.userId": {
                $exists: true
            }
        }
    },
    {
        $count: "NumberOfMsgSent"
    }
])

Mongo Playground