我在这里有点麻烦。所以我想显示一个用户的个人资料。用户属于组。登录的用户可以查看他们共有的任何组的详细信息。这是一些示例数据

{
  _id: "1234",
  battletag: "Fake#1234",
  guilds: [{
    name: "Lok'Narosh!",
    rank: 4,
    roles: ['casual']
  }, {
    name: "Warlords of Draenor",
    rank: 2,
    roles: ['PvP', 'raider']
  }, {
    name: "Lok'Tar Ogar!",
    rank: 3,
    roles: ['raider']
  }],
}


我可以获取当前用户的组并将其减少为['Lok'Narosh!', 'Warlords of Draenor'],这意味着应从结果中省略Lok'tar Ogar

我遇到的主要问题是,我知道的大多数操作仅返回第一个结果。例如,使用$elemMatch


  $ elemMatch运算符将查询结果中字段的内容限制为仅包含与$ elemMatch条件匹配的第一个元素。


有没有一种方法可以过滤此列表以包含针对元素列表的所有匹配元素?

最佳答案

您可以使用聚合:


$ unwind运算符可解构“行会”字段。
应用$ match条件
重建数组。

db.getCollection('yourColl')。aggregate({$ unwind:“ $ guilds”},{$ match:{“ guilds.rank”:{$ gte:2.0}}},{$ group:{“ _id”: “ $ _id”,“ battletag”:{$ first:“ $ battletag”},“ guilds”:{$ addToSet:“ $ guilds”}}})

09-19 13:33