mongo php获取最后一个嵌套数组为value的记录

mongo php获取最后一个嵌套数组为value的记录,php,mongodb,mongodb-query,aggregation-framework,Php,Mongodb,Mongodb Query,Aggregation Framework,我有一个mongodb和php设置。数据库有包含嵌套文档/数组/对象的记录 对象是“历史记录”,每次我们用新的审阅状态更新记录时,我们都会将审阅注释、历史记录和审阅者名称保存到数组中。基本上这意味着可能有1,2,3,4。。。数组中的子项。我想查询数组的最后一个条目在哪里=到某个状态 我想选择最后一个历史记录条目为1的所有记录 即: I您可以在第一个项目阶段使用您的情况来获取数组中的最后一个元素(当您使用负位置时,项目从数组的末尾开始计数) 在下一个阶段中,找到BAP值为1的文档 下面是一个例子:

我有一个mongodb和php设置。数据库有包含嵌套文档/数组/对象的记录

对象是“历史记录”,每次我们用新的审阅状态更新记录时,我们都会将审阅注释、历史记录和审阅者名称保存到数组中。基本上这意味着可能有1,2,3,4。。。数组中的子项。我想查询数组的最后一个条目在哪里=到某个状态

我想选择最后一个历史记录条目为1的所有记录

即:


I您可以在第一个项目阶段使用您的情况来获取数组中的最后一个元素(当您使用负位置时,项目从数组的末尾开始计数)

在下一个阶段中,找到BAP值为1的文档

下面是一个例子:

db.collection.aggregate(

    [
        {
            $project: {
            "_id" : 1,
            "strName" : 1,
            "strContent" : 1,
            "last_arr_history" : { $arrayElemAt: [ "$arrHistory", -1 ] }     
            }
        },
        {
            $match: {
            "last_arr_history.bApproved" : 1
            }
        },

    ]    
);

I您可以在第一个项目阶段使用您的情况来获取数组中的最后一个元素(当您使用负位置时,项目从数组的末尾开始计数)

在下一个阶段中,找到BAP值为1的文档

下面是一个例子:

db.collection.aggregate(

    [
        {
            $project: {
            "_id" : 1,
            "strName" : 1,
            "strContent" : 1,
            "last_arr_history" : { $arrayElemAt: [ "$arrHistory", -1 ] }     
            }
        },
        {
            $match: {
            "last_arr_history.bApproved" : 1
            }
        },

    ]    
);
您可以在聚合管道中使用,该聚合管道允许您使用运算符处理逻辑条件,并使用特殊操作来“保留”逻辑条件为真的文档或来“删除”条件为假的文档

此操作类似于使用管道选择集合中的字段,并创建一个新字段,该字段保存逻辑条件查询的结果,然后保存后续的,不同之处在于使用一个更有效的管道阶段


考虑以下示例,该示例演示了上述概念:

db.collection.aggregate([
    { 
        "$redact": {
            "$cond": [
                { 
                    "$anyElementTrue": {
                        "$map": {
                            "input": { "$slice": ["$arrHistory", -1] },
                            "as": "el",
                            "in": { 
                                "$eq": ["$$el.bApproved", 1] 
                            }
                        }
                    }
                },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])
样本输出

/* 1 */
{
    "_id" : ObjectId("58773281894725fb3fd3f92a"),
    "strName" : "Some Record",
    "strContent" : "Something here",
    "arrHistory" : [ 
        {
            "strComment" : "Great entry",
            "bApproved" : 1.0
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("58773281894725fb3fd3f92b"),
    "strName" : "Some New Record",
    "strContent" : "Something here",
    "arrHistory" : [ 
        {
            "strComment" : "Bad story",
            "bApproved" : 0.0
        }, 
        {
            "strComment" : "Thanks for fixing story",
            "bApproved" : 1.0
        }
    ]
}

在上面的示例中,组合的工作方式是,操作符通过返回由给定表达式计算的每个检查元素来变换文档中的数组。因此,它创建了一个新数组,该数组仅由最后一个元素组成(通过),如果数组中的元素实际具有
BAPROMITED
值1,则通过这是一个真正的匹配,文档被“保留”。否则它将被“删减”并从结果中丢弃


等效的PHP示例实现:

<?php
$m = new MongoClient("localhost");
$c = $m->selectDB("yourDbName")->selectCollection("yourCollectionName");
$pipeline = array(
    array( 
        '$redact' => array(
            '$cond' => array(
                array( 
                    '$anyElementTrue' => array(
                        '$map' => array(
                            'input' => array( '$slice' => array('$arrHistory', -1) ),
                            'as' => 'el',
                            'in' => array( 
                                '$eq' => array('$$el.bApproved', 1) 
                            )
                        )
                    )
                ),
                '$$KEEP',
                '$$PRUNE'
            )
        )
    )
);
$results = $c->aggregate($pipeline);
var_dump($results);
?>

您可以在聚合管道中使用,它允许您使用运算符处理逻辑条件,并使用特殊操作来“保留”逻辑条件为真的文档,或来“删除”条件为假的文档

此操作类似于使用管道选择集合中的字段,并创建一个新字段,该字段保存逻辑条件查询的结果,然后保存后续的,不同之处在于使用一个更有效的管道阶段


考虑以下示例,该示例演示了上述概念:

db.collection.aggregate([
    { 
        "$redact": {
            "$cond": [
                { 
                    "$anyElementTrue": {
                        "$map": {
                            "input": { "$slice": ["$arrHistory", -1] },
                            "as": "el",
                            "in": { 
                                "$eq": ["$$el.bApproved", 1] 
                            }
                        }
                    }
                },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])
样本输出

/* 1 */
{
    "_id" : ObjectId("58773281894725fb3fd3f92a"),
    "strName" : "Some Record",
    "strContent" : "Something here",
    "arrHistory" : [ 
        {
            "strComment" : "Great entry",
            "bApproved" : 1.0
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("58773281894725fb3fd3f92b"),
    "strName" : "Some New Record",
    "strContent" : "Something here",
    "arrHistory" : [ 
        {
            "strComment" : "Bad story",
            "bApproved" : 0.0
        }, 
        {
            "strComment" : "Thanks for fixing story",
            "bApproved" : 1.0
        }
    ]
}

在上面的示例中,组合的工作方式是,操作符通过返回由给定表达式计算的每个检查元素来变换文档中的数组。因此,它创建了一个新数组,该数组仅由最后一个元素组成(通过),如果数组中的元素实际具有
BAPROMITED
值1,则通过这是一个真正的匹配,文档被“保留”。否则它将被“删减”并从结果中丢弃


等效的PHP示例实现:

<?php
$m = new MongoClient("localhost");
$c = $m->selectDB("yourDbName")->selectCollection("yourCollectionName");
$pipeline = array(
    array( 
        '$redact' => array(
            '$cond' => array(
                array( 
                    '$anyElementTrue' => array(
                        '$map' => array(
                            'input' => array( '$slice' => array('$arrHistory', -1) ),
                            'as' => 'el',
                            'in' => array( 
                                '$eq' => array('$$el.bApproved', 1) 
                            )
                        )
                    )
                ),
                '$$KEEP',
                '$$PRUNE'
            )
        )
    )
);
$results = $c->aggregate($pipeline);
var_dump($results);
?>