簡體   English   中英

如何在MongoDB中過濾子子文檔

[英]How filter sub sub document in MongoDB

您好,我正在使用完整的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做到這一點?

這在mongodb中很重要,mongodb中的聚合是解決此問題的正確方法。 您需要先展開供應商數組,然后展開類別數組,然后使用$ 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', ...})

它將首先展開供應商數組,然后展開類別數組

但是,由於您還使用貓鼬,因此可以使用純JavaScript。 您可以獲取所有費用,然后遍歷所有費用並獲得結果

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

盡管這種javascript方式會增加單線程環境(node js)的工作量,但對於某些典型的mongodb查詢仍然很方便

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM