我有以下数据。

{

    "name" : "Maria",
    "facebook" : [
        {
            "data" : "fb.com",
            "privacy" : true
        }
    ],
    "twitter" : [
        {
            "data" : "twitter.com",
            "privacy" : false
        }
    ],
    "google" : [
        {
            "data" : "google.com",
            "privacy" : true
        }
    ],
    "phno" : [
        {
            "data" : "+1-1289741824124",
            "privacy" : true
        }
    ]
}


我只想返回具有隐私权的数据等于true。我该怎么做 ?

我试过了,但它返回的所有具有隐私的数据也等于false。如何查询数据?

请发布MongoDB查询而不是Javascript代码。

谢谢!

最佳答案

编辑

具有这样的结构:

{
    "_id" : ObjectId("575e4c8731dcfb59af388e1d"),
    "name" : "Maria",
    "providers" : [
        {
            "type" : "facebook",
            "data" : "fb.com",
            "privacy" : true
        },
        {
            "type" : "twitter",
            "data" : "twitter.com",
            "privacy" : false
        },
        {
            "type" : "google",
            "data" : "google.com",
            "privacy" : true
        },
        {
            "type" : "phno",
            "data" : "+1-1289741824124",
            "privacy" : true
        }
    ]
}


用这样的查询:

db.maria.aggregate([{
            $project : {
                _id : 1,
                name : 1,
                "providers" : {
                    $filter : {
                        input : "$providers",
                        as : "p",
                        cond : {
                            $eq : ["$$p.privacy", true]
                        }
                    }
                }
            }
        }
    ])
    ])


我们正在获得动态输出,并且我们不需要关心提供者名称,因为通用结构涵盖了该名称

{
    "providers" : [
        {
            "type" : "facebook",
            "data" : "fb.com",
            "privacy" : true
        },
        {
            "type" : "google",
            "data" : "google.com",
            "privacy" : true
        },
        {
            "type" : "phno",
            "data" : "+1-1289741824124",
            "privacy" : true
        }
    ],
    "name" : "Maria"
}


编辑结束

您可以使用聚合框架来实现。
由于每个字段都有一个数组,因此我们需要先对其展开,然后可以使用$project设置字段值或直接将其设置为null。由于这看起来像一个简单的查询,因此可能会带来一些麻烦。我们可以改进的方法是更改​​文档结构,以具有提供程序数组和简单的providerType字段。

汇总阶段如下:

db.maria.find()
var unwindFb = {
    $unwind : "$facebook"
}
var unwindtw = {
    $unwind : "$twitter"
}
var unwindgo = {
    $unwind : "$google"
}
var unwindph = {
    $unwind : "$phno"
}
var project = {
    $project : {
        _id : 1,
        name : 1, // list other fields here

        facebook : {
            $cond : {
                if  : {
                    $gte : ["$facebook.privacy", true]
                },
            then : [{
                    data : "$facebook.data",
                    privacy : "$facebook.privacy"
                }
            ],
            else  : null
        }
    },
    twitter : {
        $cond : {
            if  : {
                $gte : ["$twitter.privacy", true]
            },
        then : [{
                data : "$twitter.data",
                privacy : "$twitter.privacy"
            }
        ],
        else  : null
    }
},
google : {
    $cond : {
        if  : {
            $gte : ["$google.privacy", true]
        },
    then : [{
            data : "$google.data",
            privacy : "$google.privacy"
        }
    ],
    else  : null
}
},
phno : {
    $cond : {
        if  : {
            $gte : ["$phno.privacy", true]
        },
    then : [{
            data : "$phno.data",
            privacy : "$phno.privacy"
        }
    ],
    else  : null
}
}
}
}

db.maria.aggregate([unwindFb, unwindtw, unwindgo, unwindph, project])


然后输出如下所示:

{
    "_id" : ObjectId("575df49d31dcfb59af388e1a"),
    "name" : "Maria",
    "facebook" : [
        {
            "data" : "fb.com",
            "privacy" : true
        }
    ],
    "twitter" : null,
    "google" : [
        {
            "data" : "google.com",
            "privacy" : true
        }
    ],
    "phno" : [
        {
            "data" : "+1-1289741824124",
            "privacy" : true
        }
    ]
}

关于javascript - 如何选择给定条件的数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37773936/

10-10 00:16
查看更多