【问题标题】:Node.js - Angular - MongoDB - for `userid` , get `username`Node.js - Angular - MongoDB - 对于`userid`,获取`username`
【发布时间】:2018-03-28 01:32:17
【问题描述】:

我有这样的 mongoose.Schema:

User.js:

const mongoose = require('mongoose');
const bcrypt = require('bcrypt-nodejs');
const Schema = mongoose.Schema;

const UserSchema = new Schema({

    username: String,
    password:  String,      
    email:  String,      
});

module.exports = mongoose.model('users', UserSchema, 'users');

product.js:

const mongoose = require('mongoose');
var mongoosePaginate = require('mongoose-paginate');
const Schema = mongoose.Schema;

const ProductSchema = new Schema({

    userid: {type:String, required: true},
    product_name: {type:String, required: true}     
});

ProductSchema.plugin(mongoosePaginate);
module.exports = mongoose.model('products', ProductSchema, 'products');

方法:

exports.selectUsersProductsCount = function (req, res, next) {

  Product.aggregate([
    {"$group" : {_id:{userid:"$userid" }, count:{$sum:1} }   }
],
function(err, result) {
    if(err){ res.status(400).json({ success: false, message:'Error processing request '+ err }); }
        res.status(201).json({
          success: true,
          data: result
    });
    console.log(result);
})

}

结果:

[ { _id: { userid: '5ab655bbb94733156c438112' }, count: 3 },
  { _id: { userid: '5ab425c6f5bff145304092f7' }, count: 1 } ]

我也希望显示username 字段。我不知道如何使用join。计数正确,但不显示用户名字段。

如何更正aggregate方法显示: 用户名、用户名、计数

[ { _id: { userid: '5ab655bbb94733156c438112', username: 'Jon Alon' }, count: 3 },
  { _id: { userid: '5ab425c6f5bff145304092f7', username: 'Jonson Con' }, count: 1 } ]

示例数据:

产品

{
    _id:O bjectId(5ab7da972ade533790268f47),
    userid:"5ab655bbb94733156c438112",
    product_name:"gs",
    __v:0
},{
    _id: ObjectId(5ab7daa92ade533790268f48),
    userid:"5ab655bbb94733156c438112",
    product_name:"dg",
    __v:0 
}

用户

{
    _id: ObjectId(5ab655bbb94733156c438112),
    username: "rrrr",
    email:"rrrr",
    __v:0 
}

【问题讨论】:

    标签: node.js angular mongodb


    【解决方案1】:

    您必须使用 $lookup 函数来实现这一点,但您需要在 2 个集合之间有一些共同的属性。 您需要在 UserSchema 或其他一些属性上添加 userId,以便您可以“加入”

    在你的例子中你可以尝试

    db.product.aggregate([ {$lookup:{ from: "user", localField: "ObjectId(userid)", foreignField: "ObjectId(_id)", as: "username" }}, {"$group" : {_id:{userid:"$userid", username : "$username" }, count:{$sum:1} } } ])
    

    【讨论】:

    【解决方案2】:

    解决方案

    products.aggregate([
    
      {$lookup:{
        from: "users",
        localField: "ObjectId(userid)",
        foreignField: "ObjectId(_id)",
        as: "users"
      }},
    
    
    { "$group" :
      {
        _id: { userid: "$userid" },
        name: { $last: "$users.username" } ,
        count: { $sum: 1 }
      }
    }, {$sort: {"_id.userid":  1}}
    
      ], function(err, result) {
          console.log(result);
          if(err){ res.status(400).json({ success: false, message:'Error processing request '+ err }); }
              res.status(201).json({
                success: true,
                data: result
          });  
        }
      );
    }
    

    返回:

    [ { _id: { userid: '5ab425c6f5bff145304092f7' },
        name: [ 'cccc', 'rrrr', 'zzzz' ],
        count: 3 },
      { _id: { userid: '5ab655bbb94733156c438112' },
        name: [ 'cccc', 'rrrr', 'zzzz' ],
        count: 1 },
      { _id: { userid: '5aba7e8c045115340496becd' },
        name: [ 'cccc', 'rrrr', 'zzzz' ],
        count: 2 } ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多