使用mongodb中的文档的特定键值对检索选定的子数组

时间:2014-03-09 10:19:15

标签: php mongodb mongodb-query aggregation-framework

我正在尝试检索满足特定条件的文档子数组列表。

"_id" : "something",
"players" : [
    {
        "Name" : "Sunny"
        "score": 20
    },
    {
        "Name" : "John"
        "score" : 40
    },
    {
        "Name" : "Alice"
        "score" : 20
    },
    etc...
]

我想要得分= 20的输出

{
    "Name" : "Sunny"
    "score": 20
},
{
    "Name" : "Alice"
    "score" : 20
}

但我尝试查询:

db.collection.find(
    { "players.score":20, "_id":"something" },
    { "players" :1 }
) 

但它给了我所有3个子数组,如

{
    "Name" : "Sunny"
    "score": 20
},
{
    "Name" : "John"
    "score" : 40
},
{
     "Name" : "Alice"
    "score" : 20
}

如果我使用投影仪“$”或$ matchelement,如:

db.collection.find({ "players.$.score":20, "_id":"something" }

它给出了第一个数组示例

{
    "Name" : "Sunny"
    "score": 20
}

任何人都可以帮我解决这个问题。 提前谢谢:)

1 个答案:

答案 0 :(得分:1)

是的,positional $运算符匹配匹配数组条件中找到的第一个元素。为了过滤您想要的元素,请使用aggregate

db.collection.aggregate([
    // Uwinds the array (de-normalize)
    { "$unwind": "$players" },

    // Match just the elements you want
    { "$match": { "players.score": 20 } },

    // Push everything back into an array like it was        
    { "$group": { 
        "_id": "$_id",
        "players": { "$push": { 
            "name": "$players.name",
            "score": "$players.score"
        }} 
    }}
])

如果您的文档有更多详细信息,并且您也需要该文档,请参阅here

对于记录,您尝试的除直接 .表示法以外的其他运算符为$elemMatch