Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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
Mongodb Mongo:查询嵌套在键为变量的子数组中的值_Mongodb - Fatal编程技术网

Mongodb Mongo:查询嵌套在键为变量的子数组中的值

Mongodb Mongo:查询嵌套在键为变量的子数组中的值,mongodb,Mongodb,我正在尝试构建一个Mongo查询,在此查询中,我可以根据子数组中的值选择文档,在子数组中,嵌入数组的键将随着文档的变化而变化 在下面的示例中,我们有三个文档数组。提取每种葡萄酒的名称是微不足道的。当我想要选择品尝结果大于20的葡萄酒时,问题就来了。问题是,当我运行查询时,我不知道航班的名称;它可能是任何东西 因此,我不能只检查嵌入数组的值 我考虑过类似的事情 $ary\u query=array('teaching\u results.*'=>'$gt:20') 但显然,通配符在Mongo中不起

我正在尝试构建一个Mongo查询,在此查询中,我可以根据子数组中的值选择文档,在子数组中,嵌入数组的键将随着文档的变化而变化

在下面的示例中,我们有三个文档数组。提取每种葡萄酒的名称是微不足道的。当我想要选择品尝结果大于20的葡萄酒时,问题就来了。问题是,当我运行查询时,我不知道航班的名称;它可能是任何东西

因此,我不能只检查嵌入数组的值

我考虑过类似的事情

$ary\u query=array('teaching\u results.*'=>'$gt:20')

但显然,通配符在Mongo中不起作用(至少不是这样)。有什么想法吗

以下是示例阵列:

ary_wines = array(
"name" => "Ripple",
"year" => "2013",
"style" => "cabernet", 
"size" => "750ml",
"tasting_results" => array (
    "flight_42" => 12,
    "flight_2" => 18,
    "flight_33" => 7 
    )
)

ary_wines = array(
"name" => "Riunite",
"year" => "2012",
"style" => "White Zinfandel", 
"size" => "1.5L",
"tasting_score" => array (
    "flight_6" => 14,
    "flight_54" => 21,
    "flight_98" => 3 
    )
)

ary_wines = array(
"name" => "Maneschewitz",
"year" => "2012",
"style" => "Grape Juice", 
"size" => "500ml",
"tasting_score" => array (
    "flight_7" => 12,
    "flight_41" => 26,
    "flight_9" => 3 
    )
)

从技术上讲,您可以使用
$where
子句执行表扫描样式查询:

db.wines.find({$where: function() {
    var keys = Object.keys(this.tasting_score);
    keys.forEach(function(key) {
        if(this.tasting_score[key] > 20) { return true; }
    });
    return false;
});

但是,我恳求你,这是一个糟糕的想法,最好是以一种可索引的方式将数据放入数据库,在那里可以使用标准的查询方法。具体操作方式取决于应用程序将如何操作数据,但至少您可以在插入时进行预处理,并在对象中设置一个
maxTastingScore
参数,以查询这是否是唯一不适合您的数据结构的查询。

您是否可以尝试单独筛选项并执行类似OR的操作

我有一个类似于

"entities": {
    "user_mentions": {
    "0": {
        "indices": {
            "0": 0,
            "1": 10 
        }
    },
    "1": {
        "indices": {
            "0": 41,
            "1": 51 
         }
    } 
}
查询可能如下所示:

{
"entities.user_mentions.indices.0": {$gt:10},
"entities.user_mentions.indices.1": {$gt:20}
}

另外,请参考

谢谢David,是的,我正在考虑类似的东西,但后来放弃了它,因为它似乎无法很好地扩展。所以,我想我需要改变我构建文档的方式,这基本上就是你所说的。是的,如果你能找到正确的文档结构,MongoDB会给你带来性能提升。如果没有一个好的结构,那么使用PostgreSQL或者使用Neo4j可能更有意义。但是经过一些思考,也许你可以用这样的结构来做:
品尝评分:[{flight\u num:7,评分:20},{flight\u num:18,评分:7},…]
。然后您可以
db.wines.find({“品尝”\u score.score:{$gt:20}})
。当然,这将取决于您打算执行的其他查询。