查询多个集合Node.js

时间:2019-08-22 20:07:28

标签: node.js mongodb mongoose

您好,我想加入这些收藏集,我想让所有具有“ active”属性等于false的用户。我不知道如何获取此查询。有我的架构:

用户架构

const mongoose = require('mongoose');
    const Schema = mongoose.Schema;

    const UserSchema = new Schema({
        name: {
            type: String,
            required: true
        },
        email: {
            type: String,
            required: true
        },
        password: {
            type: String,
            required: true
        },
        type: {
            type: String,
            required: true
        },
        active:{
            type:Boolean
        }
    });

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

公司架构:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

        const CompanySchema = new Schema({
            userId: {
                type: mongoose.Schema.Types.ObjectId,
                ref: 'users'
            },
            companies: [{
                name: {
                    type:String
                },
                country:{
                    type:String
                }
            }
            ]
        });

        module.exports = Company = mongoose.model('company', CompanySchema);

注意:并非所有用户的公司都只有“客户”类型,我想同时获得“客户”和“雇员”

1 个答案:

答案 0 :(得分:1)

您可能希望重构架构,以更好地适应可用数据的类型。

例如:

用户架构:

const UserSchema = new Schema({
    name: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true
    },
    type: {
        type: String,
        required: true
    },
    active:{
        type:Boolean
    },
    companies: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'company'
    }]        
});

和公司架构:

const CompanySchema = new Schema({
    name: {
        type:String
    },
    country:{
        type:String
    }
});

然后获取所有活动用户的列表,并自动为这些用户填充任何公司数据(假设您的用户模型称为UserModel)

UserModel.find({ active: false }).populate('companies').exec();

如果由于任何原因而无法编辑数据结构,则可以执行类似于以下的查询:

CompanyModel.aggregate([
    { $lookup: { from: 'users', localField: 'userId', foreignField: '_id', as: 'user' } },
    { $match: { '$user.active': false } }
]).exec()

这将在UserId字段上执行汇总查找,然后仅在active属性设置为false的情况下进行匹配。