【问题标题】:MongoDB query multiple valuesMongoDB查询多个值
【发布时间】:2015-03-01 15:23:45
【问题描述】:

我有一个类似这样的用户模型:

{
  email: String,
  name: String,
  role: String,
  location: {
    country: String,
    city: String
  },
  contacts: {
    email: String,
    phone: String
  }
}

我的想法是在主页中显示以下信息:

  • 每个用户都有详细信息。
  • 每个国家/地区的用户数量。
  • 该国家/地区的每个城市以及该城市的用户数量。

所以,在标题中我希望有一个国家/地区列表:

  • 英国 (219)
  • 德国 (128)
  • 法国 (87)
  • 意大利 (84)
  • 等等……

每个国家/地区的城市列表:

  • 伦敦 (119)
  • 利物浦(76)
  • 曼彻斯特 (3)
  • 等等……

在正文中是用户列表...

我目前的查询适用于除城市以外的所有地方。

查询是:

User.aggregate([
        { 
            $group: { 
                _id: { country: '$location.country' },
                users: { $push: '$$ROOT' },
                cities: { $addToSet: '$location.city' },
                count: { $sum: 1 }
            }
        }
    ], function(err, results) {

        console.log(results);

    });
};

$sum 包含在$addToSet 中会很好,但不幸的是它不起作用。

如何改进此代码?

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    这是一个 mongo 查询,可以满足您的要求:

    User.aggregate([
      { $group: { _id: { city: "$location.city", country: "$location.country" }, users: { $push: "$$ROOT" }, count: { $sum: 1 } } },
      { $group: { _id: "$_id.country", count: { $sum: "$count" }, cities: { $push: { city: "$_id.city", count: "$count", users: "$users" } } } }
    ], function(err, results) {
        console.log(results);
    });
    

    【讨论】:

    • 谢谢,这只是一个问题:我有一系列城市,例如 ['London', 'London', 'London', etc...] 并且计数是正确的。我正在使用 addToset 来避免 City 重复...如何才能为每个 City 设置一个 City 以及该城市的 User 数量?
    • 我没有看到这种行为。您确定您正确实施了吗?它应该在第一个 $group 中按城市和国家/地区分组,所以当它到达第二个 $group 时只会有一个“伦敦”。
    • 哦,好吧,现在可以正常使用了!这是我的日志中的错误!干杯
    • 还有一个问题:我怎样才能保留第一个 $group 中的一些值,例如用户总数,以便也有记录:total users: n。泰
    • 可能最好的解决方案是在来自results 的代码中添加国家/地区总数。另一种可能性是只做一个单独的Users.count({},function(err, count) {}); 但是如果你觉得你真的必须在同一个命令中使用 mongodb 计算的总用户数,请提出一个新问题,因为我不想污染原始答案问题和margin of this comment is too small to contain the answer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    相关资源
    最近更新 更多