嗨,我正在尝试在嵌套文档数组上编写条件查询。 我已经阅读了好几天的文档,却无法弄清楚如何进行这项工作。 DB如下所示:
[
{
"id":1,
"team":"team1",
"players":[
{
"name":"Mario",
"substitutes":[
"Luigi",
"Yoshi"
]
},
{
"name":"Wario",
"substitutes":[
]
}
]
},
{
"id":2,
"team":"team2",
"players":[
{
"name":"Bowser",
"substitutes":[
"Toad",
"Mario"
]
},
{
"name":"Wario",
"substitutes":[
]
}
]
}
]
由于我缺乏英语,很难讲,但我想做的是 寻找包括所有被查询球员的球队。 玩家数组中的每个对象都有一些替代品。 对于玩家数组中的每个对象,如果所查询的玩家之一不是主要玩家(“ players.name”),那么我希望它查找是否有替代者(“ players.substitutes”)之一。
Team.find({players:{$in:[ 'Mario', 'Wario' ]}}) (mongoose query)
这将给我一个带有'team1'的数组。
但是我想得到的都是两支球队,因为“马里奥”是“弓箭手”(team2)的替代者之一。
我无法进行查询,但是自从MongoDB官方文档说:
以来,我一直在尝试不使用$ where。推荐的替代方案
从MongoDB 3.6开始,$ expr运算符允许使用 查询语言中的聚合表达式。并且,从 MongoDB 4.4,$ function和$ accumulator允许用户定义 如果提供的管道,则使用JavaScript中的自定义聚合表达式 操作员无法满足您的应用程序需求。
给出可用的聚合运算符:
将$ expr与不使用JavaScript的聚合运算符一起使用 (即非$ function和非$ accumulator运算符)比 $ where,因为它不执行JavaScript,因此应该首选 如果可能的话。但是,如果必须创建自定义表达式,则$ function 比
$where
更为可取。
但是如果可以轻松地使用$where
运算符编写,那么就很好了。
任何有助于进一步发展的建议或想法都将受到高度赞赏。
答案 0 :(得分:0)
首先,您的查询不正确。而且您的过滤条件究竟是什么也不是很明显。所以我给出两个建议:
如果要过滤在匹配条件中定义了db.Team.find({"players.name":{$in:[ 'Mario', 'Wario' ]}}).pretty()
的所有文档(返回两个文档):
db.Team.find({"players.substitutes":{$in:[ 'Mario', 'Wario' ]}}).pretty()
如果要过滤所有在替代数组中具有任何提供的球员姓名的文档(由于team1没有任何替代,则仅返回一个,因此返回Mario / Wario)
name
正在查看的名称可能出现在substitute
或db.Team.find({ $or: [{"players.substitutes":{$in:[ 'Mario', 'Wario' ]}}, {"players.name":{$in:[ 'Mario', 'Wario' ]}}] }).pretty()
org.apache.httpcomponents:httpclient