Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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
Mysql 限制获取所需的文档_Mysql_Mongodb_Mongodb Php - Fatal编程技术网

Mysql 限制获取所需的文档

Mysql 限制获取所需的文档,mysql,mongodb,mongodb-php,Mysql,Mongodb,Mongodb Php,我正在使用Mongodb,但是我可以迁移到mysql,我的问题是,我有一个集合,它包含像这样的数据 array( "L"=>"cars", "M"=>"wolkswagen" ) array( "L"=>"cars", "M"=>"bmw" ) array( "L"=>"cars", "M"=>"mercedes" ) array( "L"=>"bike", "M"=>"bianchi" ) array( "L"=>"bike", "M"

我正在使用Mongodb,但是我可以迁移到mysql,我的问题是,我有一个集合,它包含像这样的数据

array(
"L"=>"cars",
"M"=>"wolkswagen"
)
array(
"L"=>"cars",
"M"=>"bmw"
)
array(
"L"=>"cars",
"M"=>"mercedes"
)


array(
"L"=>"bike",
"M"=>"bianchi"
)
array(
"L"=>"bike",
"M"=>"trek"
)
array(
"L"=>"bike",
"M"=>"brook"
)
我想得到的结果是,任何一辆自行车和一辆汽车,但每个都有两个结果,所以结果应该是

array(
"L"=>"cars",
"M"=>"some car"
)
array(
"L"=>"cars",
"M"=>"some car"
)


array(
"L"=>"bike",
"M"=>"some bike"
)
array(
"L"=>"bike",
"M"=>"some bike"
)

我试着用$in来解决这个问题,但似乎不起作用,有什么想法吗?

在MongoDB 2.2+中有几种方法可以解决这个问题

不幸的是,2.2.2中的聚合框架还不支持
$slice
或数组子集操作符,因此需要一些额外的操作

注意:下面的示例使用的是
mongo
shell,但是应该可以直接转换为PHP驱动程序

示例#1:使用聚合框架提取两个匹配项(第一个和最后一个) 假设您不担心每个分组得到哪两个元素,您可以选择
$first
$last

db.cars.aggregate(

    // Group by $L and find the first and last elements
    { $group: {
        _id: '$L',
        first: { $first: "$M" },
        last: { $last: "$M" },
    }},

    // Add an extra $index for # of array elements
    { $project: {
        first: 1,
        last: 1,
        index: { $const:[0,1] }     
    }},

    // Split into document stream based on $index
    { $unwind: '$index' },

    // Re-group data using conditional to create array 
    { $group: {
        _id: '$_id',
        M: {
            $push: { $cond:[ {$eq:['$index', 0]}, '$first', '$last'] }
        }
    }}
)
样本输出:

{
    "result" : [
        {
            "_id" : "cars",
            "M" : [
                "wolkswagen",
                "mercedes"
            ]
        },
        {
            "_id" : "bike",
            "M" : [
                "bianchi",
                "brook"
            ]
        }
    ],
    "ok" : 1
}
示例2:使用聚合框架创建一个集合,然后减少 上述方法的另一种选择是使用
$addToSet
和修剪数组元素的后处理步骤的更简单管道:

var agg = db.cars.aggregate(
    { $group: {
        _id: '$L',
        'M': { $addToSet: "$M" },
    }}
)

// Iterate to trim each result to the desired # of elements
agg.result.forEach(function(doc) {
    // Note: you could randomly select 2 (or n) elements here
    doc.M = doc.M.slice(0,2);
})

输出格式与示例#1相同,但示例#2(如所述)不选择第一个和最后一个元素,而是选择前两个元素。

您需要进行两次查询并使用
limit
,例如:
$db->col->find(array('L'=>bike')->limit(2)
$db->col->find(数组('L'=>'cars'))->限制(2)mongodb还没有办法限制特定的子句。我有16个这样的子句,这不是一个好主意,我必须找到另一个解决办法,谢谢:)我不确定你还能在这里做什么,我想你可以改变你的模式,但我不确定。我甚至不确定MySQL是否在不破坏性能的情况下支持这一点,因为示例数组中的每个元素表示一个单独的文档(即,您有六个文档),或者它们是作为一个数组存储在单个文档中的?另外,您是否关心L的每个值对应哪两个元素,或者任何两个元素都会这样做?@Stennie是的,它们代表一个单独的文档请投票/观看相关的MongoDB功能请求。