【问题标题】:MongoDB query only records that have two unique values togetherMongoDB 仅查询同时具有两个唯一值的记录
【发布时间】:2021-06-14 06:21:20
【问题描述】:

我的收藏中有几条记录,我只需要找到那些具有两个不同属性的记录,然后按其中一个属性对它们进行分组。我一直在寻找答案,但没有任何成功(但我对 mongo 还是很陌生)。为了更好地解释我自己,我将使用这个例子:

我的 MongoDB 集合中有以下数据(表示向 webhook 发出的请求、由谁发出的请求、是否成功以及它的内容):

{ sender: 6, domainID: "AAA", success: false, content: "Lorem ipsum" }
{ sender: 6, domainID: "AAA", success: true, content: "Lorem ipsum" }
{ sender: 7, domainID: "CCC", success: true, content: "Lorem ipsum" }
{ sender: 8, domainID: "CCC", success: false, content: "Lorem ipsum" }

现在我已经编写了一个查询,它按senderaggregate 对请求进行分组。然而,这只是问题的一部分。我也有兴趣只获取对某个用户失败的domainID 的请求(这是我正在努力解决的部分)。使用先前的数据,查询应该返回如下内容:

[
  {
    _id: 8,
    pendingRequests: [
      { content: "Lorem ipsum" }
    ]
  }
]

为此,我检查success = false,但我还需要检查senderdomainID 是否没有其他记录。

到目前为止,我的解决方案是这个:

const unread = await WebhooksCollection.aggregate([
    { $match: { success: false } },
    {
        $group: {
            _id: '$sender',
            pendingRequests: {
                $push: {
                    content: "$content"
                }
            }
        }
    }
]);

我的麻烦是检查是否没有更多记录/尝试该 senderdomainID

【问题讨论】:

    标签: mongodb mongoose mongodb-query


    【解决方案1】:

    删除第一个$match 阶段,因为它将删除所有具有success 状态true 的发件人,并且可能会误导下一个阶段,以了解是否有任何其他domainID 具有不同的success 状态。

    解决方案 #1

    success 数组进行分组并仅返回所有包含false 的文档。

    const unread = await WebhooksCollection.aggregate([
        {
            $group: {
                _id: "$sender",
                success: { $push: "$success" },
                pendingRequests: {
                    $push: { content: "$content" }
                }
            }
        },
        {
            $match: {
                success: { $nin: [true] }
            }
        }
    ])
    

    解决方案 #2

    计算false 的值并仅考虑那些总和为false > 0 的文档。

    const unread = await WebhooksCollection.aggregate([
        {
            $group: {
                _id: "$sender",
                falseCount: {
                    $sum: {
                        $cond: {
                            if: "$success", then: { $sum: -1 }, else: { $sum: 1 }
                        }
                    }
                },
                pendingRequests: {
                    $push: { content: "$content" }
                }
            }
        },
        {
            $match: {
                falseCount: { $gt: 0 }
            }
        }
    ]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 2016-06-07
      • 1970-01-01
      • 2015-11-12
      相关资源
      最近更新 更多