用于计算id是否属于的Mongodb$项目

用于计算id是否属于的Mongodb$项目,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我们有一个广播通知的模型,当用户读取其中一个通知时,它保持不变,以显示不同的状态 我们将此readBy作为子文档数组保存 我想知道是否有一种方法可以在mongoosejs中使用aggregate或map reduce,是否可以计算用户是否是返回true而不是所有readers数组的读卡器之一 {_id: "1", title: "A", readBy:["User1","User2"] } {_id: "2", title: "B", readBy:["User1"] } {_id: "3",

我们有一个广播通知的模型,当用户读取其中一个通知时,它保持不变,以显示不同的状态

我们将此readBy作为子文档数组保存

我想知道是否有一种方法可以在mongoosejs中使用aggregate或map reduce,是否可以计算用户是否是返回true而不是所有readers数组的读卡器之一

{_id: "1", title: "A", readBy:["User1","User2"] }
{_id: "2", title: "B", readBy:["User1"] }
{_id: "3", title: "C", readBy:["User2"] }
如果User1尝试恢复文档列表,我想返回的内容如下:

{_id: "1", title: "A", read: true }
{_id: "2", title: "B", read: true }
{_id: "3", title: "C", read: false }
{_id: "1", title: "A", readBy: ["User1"] }
{_id: "2", title: "B", readBy: ["User1"] }
{_id: "3", title: "C", readBy: [] }
显然,我可以在服务器上执行post处理,但我想知道是否有一种方法可以直接使用mongodb进行计算

另一个选项是仅使用User1过滤readBy数组的内容,类似于:

{_id: "1", title: "A", read: true }
{_id: "2", title: "B", read: true }
{_id: "3", title: "C", read: false }
{_id: "1", title: "A", readBy: ["User1"] }
{_id: "2", title: "B", readBy: ["User1"] }
{_id: "3", title: "C", readBy: [] }
有什么建议吗


谢谢。

如果您有mongodb 3.4+版,那么您可以使用operator:

db.collection.aggregate([
    { $project: { _id:1, title:1, read: {$in:["User1", "$readBy"]} }}
])
db.collection.aggregate([
    {
        $project: {
            _id:1, 
            title:1, 
            readBy: { 
                $filter: {
                    input: "$readBy",
                    as: "user",
                    cond: { $eq: ["$$user", "User1"] }
                }
            }
        }
    }
])
对于mongodb 3.2+版,您可以通过运营商实现第二个选项:

db.collection.aggregate([
    { $project: { _id:1, title:1, read: {$in:["User1", "$readBy"]} }}
])
db.collection.aggregate([
    {
        $project: {
            _id:1, 
            title:1, 
            readBy: { 
                $filter: {
                    input: "$readBy",
                    as: "user",
                    cond: { $eq: ["$$user", "User1"] }
                }
            }
        }
    }
])

谢谢Sergei,最后我决定用elemMatch使用find和Reduced the readBy list。为此,我将readby的结构从字符串数组更改为子文档数组。但你的解决方案是有效的。所以我同意你!非常感谢。