0

我有一个类似于此的 mongodb 文档:

{
"id": 1,
"title": "This is the title",
"body" : "This is the body",
"comments": [
    {
        "email_address": "mirko.benedetti@somemail.com",
        "name": "Mirko",
        "surname": "Benedetti",
        "language": "it",
        "text": "This is a message",
        "published": "Y",
        "on": "2014-03-22 15:04:04"
    },
    {
        "email_address": "marc.surname@somemail.com",
        "name": "Marc",
        "surname": "Surname",
        "language": "it",
        "text": "Another Message",
        "published": "N",
        "on": "2014-03-23 15:04:05"
    }
  ]
}

我有一个这样的查询:

$this->db->collection->find(array('id' => $id, 'language' => $lang, 'comments.published' => 'Y'),
                        array('comments.name' => 1, 'comments.surname' => 1, 'comments.text' => 1, 'comments.on' => 1, '_id' => 0));

我的问题是运行该查询,mongodb 返回两个我不想要的评论,我只想要带有“已发布”的消息:“Y”。

例如,我尝试运行 'comments.published' => 'something' 并且未选择任何评论,这是正确的,但如果至少有一个评论将“已发布”标志设置为“Y”,则会显示两条评论.

欢迎任何帮助。

4

2 回答 2

1

查看$elemMatch 文档

db.schools.find( { zipcode: "63109" },
                 { students: { $elemMatch: { school: 102 } } } )
于 2016-11-18T15:51:42.237 回答
1

使用 elemMatch 运算符时需要小心。首先它有两种变体。$elemMatch(投影) & $elemMatch(查询)

elemMatch(projection) 变体似乎有效,因为您拥有的过滤条件仅与 comments 数组中的一个值匹配。

以下查询将正常工作。

find({'_id' : ObjectId("582f2abf9b549b5a765ab380"), comments: { $elemMatch: { language: "it", published : "Y" }}})

现在考虑当您在评论数组中有多个匹配值(两个具有“Y”发布状态的值)时,上述查询将不起作用,只会返回第一个匹配值。

在这种情况下,您将需要使用$filter,它将根据传递的过滤条件过滤评论数组。

aggregate([{
    $match: {
        '_id': ObjectId("582f2abf9b549b5a765ab380")
    }
}, {
    "$project": {
        "comments": {
            "$filter": {
                "input": "$comments",
                "as": "result",
                "cond": {
                    $and: [{
                        $eq: ["$$result.language", "it"]
                    }, {
                        $eq: ["$$result.published", "Y"]
                    }]
                }
            }
        }
    }
}, {
    $project: {
        "comments": {
            name: 1,
            surname: 1,
            text: 1,
            on: 1
        }
    }
}])
于 2016-11-18T19:17:46.977 回答