尝试过滤mongo db中的字段时出现意外结果

时间:2016-01-11 19:52:18

标签: mongodb

我的文件结构如下:

{
  _id: "someid",
  games: [{
    slug: "world-of-warcraft",
    class: 'shaman'
  }, {
    slug: 'starcraft-ii',
    class: 'zerg'
  }],
  roles: {
    'starcraft-ii': ['player'],
    'world-of-warcraft': ['player']
  }
}

我正在尝试对其进行过滤,以便游戏数组中只有starcraft-ii将出现在playerstarcraft-ii角色中的所有玩家。我做了以下事情:

function getUsersInGame(slug) {
  return Users.find({
    'games.slug': slug,
    [`roles.${slug}`]: 'player'
  }, {
    fields: {
      'games.$': 1,
      'roles': 1
    }
  });
}

但是,这在游戏数组中不匹配,而是返回带有world-of-warcraft的1元素数组。

在mongo中过滤此数组的适当方法是什么?

1 个答案:

答案 0 :(得分:1)

在您的字段中使用$elemMatch,因为$将返回数组的第一个元素。所以你的查询应该是这样的:

function getUsersInGame(slug) {
   return Users.find(
    {
      '"roles.'+ slug + '"': { $in : ['player']}
    }, 
    {
      'games': {
          $elemMatch: {'slug': slug}
      },
      'roles': 1
    });

请注意与文档的区别:

“$运算符根据查询语句中的某些条件投影数组元素。

$ elemMatch投影运算符采用显式条件参数。此允许您根据不在查询中的条件进行投影 ...“