我的文件结构如下:
{
_id: "someid",
games: [{
slug: "world-of-warcraft",
class: 'shaman'
}, {
slug: 'starcraft-ii',
class: 'zerg'
}],
roles: {
'starcraft-ii': ['player'],
'world-of-warcraft': ['player']
}
}
我正在尝试对其进行过滤,以便游戏数组中只有starcraft-ii
将出现在player
中starcraft-ii
角色中的所有玩家。我做了以下事情:
function getUsersInGame(slug) {
return Users.find({
'games.slug': slug,
[`roles.${slug}`]: 'player'
}, {
fields: {
'games.$': 1,
'roles': 1
}
});
}
但是,这在游戏数组中不匹配,而是返回带有world-of-warcraft
的1元素数组。
在mongo中过滤此数组的适当方法是什么?
答案 0 :(得分:1)
在您的字段中使用$elemMatch
,因为$
将返回数组的第一个元素。所以你的查询应该是这样的:
function getUsersInGame(slug) {
return Users.find(
{
'"roles.'+ slug + '"': { $in : ['player']}
},
{
'games': {
$elemMatch: {'slug': slug}
},
'roles': 1
});
请注意与文档的区别:
“$运算符根据查询语句中的某些条件投影数组元素。
$ elemMatch投影运算符采用显式条件参数。此允许您根据不在查询中的条件进行投影 ...“