我正在尝试检索满足特定条件的文档子数组列表。
"_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
}
任何人都可以帮我解决这个问题。 提前谢谢:)
答案 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。