Mongodb 如何正确构建过滤mongo中所需内容的查询

Mongodb 如何正确构建过滤mongo中所需内容的查询,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我试图理解一些mongo命令的语法 我有一些这样的数组: { “_id”:ObjectId(“5404506df59600af7d285692”), “联盟”:[{ “姓名”:“纳米的神枪手”, “层”:“白金”, “队列”:“单独排名”\u 5x5, “条目”:[{ “playerOrTeamId”:“23712130”, “playerOrTeamName”:“Woodyx”, “分部”:“V”, “联盟点数”:长(56), “胜利”:长(83)号, “isHotStreak”:错误, “是

我试图理解一些mongo命令的语法

我有一些这样的数组:

{
“_id”:ObjectId(“5404506df59600af7d285692”),
“联盟”:[{
“姓名”:“纳米的神枪手”,
“层”:“白金”,
“队列”:“单独排名”\u 5x5,
“条目”:[{
“playerOrTeamId”:“23712130”,
“playerOrTeamName”:“Woodyx”,
“分部”:“V”,
“联盟点数”:长(56),
“胜利”:长(83)号,
“isHotStreak”:错误,
“是老兵”:错,
“isFreshBlood”:错,
“isInactive”:假,
“迷你剧”:假
}],
“id”:长号码(23712130)
}, {
“名称”:“齐格斯的救赎者”,
“层”:“银”,
“队列”:“排名第五的团队”,
“条目”:[{
“playerOrTeamId”:“团队-24f25974-63de-402a-a78f-bb7811f3b362”,
“playerOrTeamName”:“RAGEDEINSTALL”,
“司”:“二”,
“联盟积分”:长(58),
“胜利”:第七名,
“isHotStreak”:错误,
“是老兵”:错,
“isFreshBlood”:错,
“isInactive”:正确,
“迷你剧”:假
}],
“id”:长号码(23712130)
}, {
“名称”:“海默丁格执政官”,
“层”:“青铜”,
“队列”:“排名第三的团队”,
“条目”:[{
“playerOrTeamId”:“团队-b8dbeb70-83b0-11e3-b41c-782bcb497d6f”,
“playerOrTeamName”:“H Fettarme Vollmilch”,
“分部”:“我”,
“联盟积分”:长(75),
“胜利”:长(4)号,
“isHotStreak”:错误,
“是老兵”:错,
“isFreshBlood”:错,
“isInactive”:正确,
“迷你剧”:假
}],
“id”:长号码(23712130)
}],
“召唤者ID”:长号码(23712130),
“地区”:“欧盟”,
“updatedAt”:数字长(1413521614)
}
这是数据库中的第一个文档。这个集合包含像这样的10万个文档。从这些文档中,我只希望返回以下文档:leagues.tier:白金、MASTER、DIAMOND和CHALLENGER(没有或仅涉及和)。而对于联赛。队列:排名_SOLO_5x5。所有与查询匹配的文档都应该返回到客户端的前端(我使用mongovue)。我试着用这个,但没用

{leagues:{$elemMatch:{tier:“PLATINUM”,queue:“RANKED_SOLO_5x5”}}
因为它也会返回其他
'league.queue'
值,而它应该只返回白金和排名的_solo_5x5。 我的新标准是:
leagues.tier:“挑战者”、“大师”、“钻石”、“白金”
leagues.queue:“排名靠前”

想要的示例输出:

{
“_id”:ObjectId(“5404506df59600af7d285692”),
“联盟”:[{
“姓名”:“纳米的神枪手”,
“层”:“白金”,
“队列”:“单独排名”\u 5x5,
“条目”:[{
“playerOrTeamId”:“23712130”,
“playerOrTeamName”:“Woodyx”,
“分部”:“V”,
“联盟点数”:长(56),
“胜利”:长(83)号,
“isHotStreak”:错误,
“是老兵”:错,
“isFreshBlood”:错,
“isInactive”:假,
“迷你剧”:假
}],
“id”:长号码(23712130)
}

要仅检索数组中的第一个匹配元素,可以在查询的
投影
文档中使用位置运算符。例如:

db.collection.find(
//查询条件
{联赛:{$elemMatch:{tier:“PLATINUM”,队列:“RANKED_SOLO_5x5”}},
//投影-仅获取“leagues”中的第一个匹配元素
{“leagues.$”:1}
)
但是,如果数组中的多个元素满足您的查询条件,则上述查询将不会有帮助。在这种情况下,您需要探索,它提供了一种使用运算符反规范化数组的方法,非常方便。例如:

db.collection.aggregate([
//将数组元素拆分为单独的文档
{“$REWIND”:“$leagues”},
//指定查询条件
{“$match”:{“leagues.tier”:“PLATINUM”,“leagues.queue”:“RANKED_SOLO_5x5”},
//按id分组并重建数组
{“$group”:{“$id”:“$id”,“leagues”:{“$push”:“$leagues”}}}
])

如您所料的输出示例非常有用。输出等于所有包含排名为_SOLO_5x5和白金的文档。亲爱的,您的命令返回以下错误消息:
命令“聚合”失败:异常:聚合结果超过最大文档大小(16MB)(响应:{“errmsg”:“异常:聚合结果超过了最大文档大小(16MB)”,“代码”:16389,“确定”:0.0}
通过添加
修复了它,{$limit:5000}
我使用gui mongovue,当使用聚合函数时,它只返回文档树。我需要返回纯json数组。我们必须使用db.collection.find()来完成此操作功能。@floppy,为了避免最大文档大小错误,最好将
$match
阶段作为第一阶段添加到聚合管道中,这样只会将较小的数据集传递到
$unwind
阶段。这也提高了聚合查询的性能,这是推荐的做法。@floppy,您可以使用在
$match
之后的
$group
阶段,并重建数组,因此结果不仅与
db.collection.find的结果相匹配,而且只包含数组中符合条件的元素