我有一个结构如下的文档:
{
_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中过滤这个数组的合适方法是什么?
发布于 2016-01-12 07:23:35
在字段中使用$elemMatch,因为$将返回数组的第一个元素。因此,您的查询应该如下所示:
function getUsersInGame(slug) {
return Users.find(
{
'"roles.'+ slug + '"': { $in : ['player']}
},
{
'games': {
$elemMatch: {'slug': slug}
},
'roles': 1
});请注意与文档的区别:
“$运算符根据查询语句中的一些条件来投影数组元素。
$elemMatch投影运算符采用显式条件参数。此允许您基于查询之外的条件进行投影...“
https://stackoverflow.com/questions/34729891
复制相似问题