如何在给定条件下选择数据

时间:2016-06-12 11:54:36

标签: javascript node.js mongodb mongoose mongodb-query

我有以下数据。

{

    "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代码。

谢谢!

3 个答案:

答案 0 :(得分:0)

修改

有这样的结构:

{
    "_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
        }
    ]
}

答案 1 :(得分:-1)

如果你愿意使用lodash ...这就是你可以做到的......

    var tmp  = {
    ...you json here 
    }

    var res =[];//result array of filtered data
     _.forIn(tmp, function (o) {
                    if (Array.isArray(o)) {
                        if (o[0].privacy === true) {
                            res.push(o);
                        }
                    }
    });

答案 2 :(得分:-1)

您可以使用以下代码迭代对象并检查隐私真实

var list = {

"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
    }
]

}

$.each(Object.keys(list), function(index,value){
  if(list[value][0].privacy)
  {
 console.log(list[value][0]);
 }
});