如何在mongo的不同字段中获取具有值的文档数

Posted

技术标签:

【中文标题】如何在mongo的不同字段中获取具有值的文档数【英文标题】:how to get the count of documents with value ​in different fields in mongo 【发布时间】:2020-10-02 18:55:58 【问题描述】:

我有一些文件如下

  
    _id: 1,
    lender_id: 10,
    borrower_id: 20,
    message: 'Message from lender'
  ,
  
    _id: 2,
    lender_id: 20,
    borrower_id: 10,
    message: 'Response to lender'
  
  
    _id: 3,
    lender_id: 10,
    borrower_id: 30,
    message: 'Message to other user'
  

当lender_id 字段或borrower_id 等于10 时,我想在这种特殊情况下获取文档的计数。

我试试这个:

    chats = await Chat.aggregate([
        
            $match:  $or: [
                lender_id: 10,
                borrower_id: 10
            ]
        ,
        
            $group: 
                _id: null,
                differentChats: $sum: 1
            
        ,
    ])

    // Response: [  _id: null, differentChats: 3  ] --- must be 2

我如何获得唯一聊天的总数。 谢谢阅读。

【问题讨论】:

【参考方案1】:

我们需要创建一个唯一的lender_idborrower_idSet,如下所示(通过更改顺序)。在最后阶段,我们采用Set 大小。

chats = await Chat.aggregate([
  
    $match: 
      $or: [ lender_id: 10, borrower_id: 10 ]
    
  ,
  
    $group: 
      _id: null,
      differentChats: 
        $addToSet: 
          $cond: [
             $gt: ["$lender_id", "$borrower_id"],
            [ "$lender_id", "$borrower_id" ],
            [ "$borrower_id", "$lender_id" ]
          ]
        
      
    
  ,
  
    $project: 
      differentChats:  $size: "$differentChats" 
    
  
])

MongoPlayground

【讨论】:

以上是关于如何在mongo的不同字段中获取具有值的文档数的主要内容,如果未能解决你的问题,请参考以下文章

Mongo - 如果子文档数组中的对象具有值,则添加字段

如何在任意深度查找 MongoDB 字段名称

如何求和具有特定查找字段值的记录数

如何使用 Mongoose 查询过滤到数组类型字段中具有指定值的文档?

MongoDB:获取具有两个值的不同组合的最新文档

如何在 Laravel 中获取非键列字段的不同值?