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