Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何选择具有给定条件的数据_Javascript_Node.js_Mongodb_Mongoose_Mongodb Query - Fatal编程技术网

Javascript 如何选择具有给定条件的数据

Javascript 如何选择具有给定条件的数据,javascript,node.js,mongodb,mongoose,mongodb-query,Javascript,Node.js,Mongodb,Mongoose,Mongodb Query,我有以下数据 { "name" : "Maria", "facebook" : [ { "data" : "fb.com", "privacy" : true } ], "twitter" : [ { "data" : "twitter.com", "privacy" : false } ],

我有以下数据

{

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


谢谢

如果您愿意使用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);
                        }
                    }
    });

您可以使用下面的代码来迭代该对象并检查隐私是否为true

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

编辑 有这样的结构:

{
    "_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]
                        }
                    }
                }
            }
        }
    ])
    ])
{
    "_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
        }
    ]
}
对于这样的查询:

{
    "_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]
                        }
                    }
                }
            }
        }
    ])
    ])
{
    "_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
        }
    ]
}
我们正在获得动态输出,我们不需要关心提供者名称,因为这是由泛型结构覆盖的

{
    "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
设置字段值或干脆为空。由于这看起来像一个简单的查询,因此可能会带来一些麻烦。我们可以改进的方法是更改文档结构,使其具有提供程序数组和简单的提供程序类型字段

聚合阶段如下:

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

您希望每个文档中的任何字段都包含
privacy:true
元素,还是希望每个像这样的文档都从这些数组中筛选出非隐私元素?另外,您尝试了什么查询但没有按预期工作?完全正确!我所做的是将条件设置为privacy:true,但它返回的数据也具有privacy:false。它应该返回所有具有隐私的数据:true。Twitter有隐私:false,因此不会返回。子数组是否希望每个包含不止一个元素,如果是这样,您是否需要返回隐私匹配的每个子阵列项目,例如,如果存在多个匹配项,您是否希望facebook阵列中包含多个项目?如果您希望JS代码执行此操作:@KaSh:谢谢您让我知道。:-)OP是问如何查询数据,而不是事后过滤。我想OP应该更具体。因为有两个答案建议类似的解决方案。显然,问题的框架不正确。是的,但问题被标记为Mongo,因此它是隐含的。OP是问如何查询数据,事后不过滤。谢谢,伙计,它起作用了。但当我有更多的账户在那个时候被动态添加时,我应该怎么做?@maria有一个更简单的方法来做,它将提供解决方案是在$filter上,所以只有一个步骤projection@MariaKari请参见使用
$filter
进行新编辑需要mongo 3.2您提供的结构更灵活。所以我要用这个结构。非常感谢你的努力。