如何在MongoDB中过滤子子文档

时间:2015-12-02 23:35:57

标签: node.js mongodb express mongoose

您好我正在使用完整的Stack' MEAN'我在MongoDB中有一个数据结构,如下所示:

var ExpenseSchema = new Schema({
    date: {
        type: Date,
        default: Date.now,
        required: 'Ingrese la fecha del comprobante'
    },
    supplier: {
        type: Schema.ObjectId,
        ref: 'Supplier',
    },
    created: {
        type: Date,
        default: Date.now
    },
    user: {
        type: Schema.ObjectId,
        ref: 'User'
    }
});


var SupplierSchema = new Schema({
    name: {
        type: String,
        default: '',
        required: 'Ingrese la Razon Social del Proveedor',
        trim: true
    },
    category: {
        type: Schema.ObjectId,
        ref: 'Category',
    },
    created: {
        type: Date,
        default: Date.now
    },
    user: {
        type: Schema.ObjectId,
        ref: 'User'
    }
});

var CategorycompraSchema = new Schema({
    name: {
        type: String,
        default: '',
        required: 'Please fill Rubrocompra name',
        trim: true
    },
    created: {
        type: Date,
        default: Date.now
    },
    user: {
        type: Schema.ObjectId,
        ref: 'User'
    }
});

每个'费用'有供应商'每个供应商都有一个'类别'

我需要进行查询,以便过滤所有'费用'在特定类别中。有人可以告诉我如何用MongoDB或mongoose做到这一点?

1 个答案:

答案 0 :(得分:0)

这是mongodb中的一个重要案例,mongodb中aggregations是解决这个问题的正确方法。您需要$unwind供应商数组,然后是类别数组,然后使用$ group将其重新组合在一起:

我的解决方案可能因您的要求而异,但您必须这样做:

db.test.aggregate(
    { $match: {...}},   //match query 
    { $unwind: '$supplier'},
    { $unwind: '$supplier.category'},
    { $match: {supplier.category.a: ...}},      //match query after unwinding of supplier and category
    { $group: {_id: '$_id', ...})

它将首先展开供应商数组,然后展开类别数组

但是既然你也在使用mongoose,你可以使用纯JavaScript。您可以获取所有费用,然后循环访问它们 获得你的结果

Expense.find().then(function(expenses) {
    expenses.forEach(function(suppliers){
        suppliers.forEach
        ...
    })
})

虽然这种javascript方式会增加单线程环境(节点js)的工作量,但它仍然可以用于一些典型的mongodb查询