获取元素上特定字段具有最小值的数组元素

时间:2014-01-27 14:52:44

标签: php mongodb

我正在尝试从集合中的数组中删除元素。要删除元素,我必须查看索引(或日期)字段,并删除具有最低值的字段。我的名为“pages”的集合的示例表示:

{
    "_id": {
        "$oid": "52e12df7e4b06e4ed65a554c"
    },
    "posts": [
        {
            "postId": {
                "$oid": "52e12e5933a9fbec1100002d"
            },
            "date": 1390489177.267876,
            "index": 1
        },
        {
            "postId": {
                "$oid": "52e12e5f33a9fb141800002c"
            },
            "date": 1390489183.277084,
            "index": 2
        }
    ],
    "skillname": "Bilardo",
    "skilltag": "Bilardo",
    "currentIndex": 2
}

我需要从posts数组中删除这个元素:

        {
            "postId": {
                "$oid": "52e12e5933a9fbec1100002d"
            },
            "date": 1390489177.267876,
            "index": 1
        }

无论我做什么,我都无法找到数组中的最小“索引”字段。我写的最后一个PHP代码如下:

$this->db->pages->find(array( 'skilltag' => 'Bilardo'), array('posts.index' => 1))->sort( array("posts.index" => -1));

我不愿意使用“index”字段和“currentIndex”字段。但是我还是把它们放在了无法处理具有时间戳值的“日期”字段的情况下。

上面的代码返回一个只包含一个元素的数组,该元素是一个包含2个元素的数组:

        {
            "postId": {
                "$oid": "52e12e5933a9fbec1100002d"
            },
            "date": 1390489177.267876,
            "index": 1
        },
        {
            "postId": {
                "$oid": "52e12e5f33a9fb141800002c"
            },
            "date": 1390489183.277084,
            "index": 2
        }

是否有聚合函数在数组内部进行过滤?我找不到任何返回最小值的聚合。我只找到聚合来返回最小值和最大值之间的值,这些值必须由用户给出 - 这在我的情况下不起作用。

1 个答案:

答案 0 :(得分:0)

posts数组字段中的嵌入对象是否始终按其dateindex排序,升序?根据您的架构,我假设通过$push更新运算符将新帖子添加到文档中。

如果要删除的元素始终位于数组的前面,则可以非常轻松地使用$pop将其删除。