猫鼬按数组中的对象过滤

时间:2019-03-13 23:09:28

标签: javascript mongodb mongoose

我有以下猫鼬模式:

var MySchema = new Schema({
    name: String,
    attributes: [ {name: String, value: Schema.Types.Mixed} ]
});

这很不幸,但是客户将决定属性是什么,所以不可能知道他们将要先行做什么。

我正在尝试编写一个通用搜索功能,该功能将基于attribute.name ='x'以及可能的attribute.value ='y'过滤结果(尽管下面的示例省略了值)。有关如何编写这种方法的任何提示?

let filter = ['name', 'attributes.name=height', 'attributes.name=superpower'];

function search(filter) {
   //This  needs to be fixed
   const mongoReply =  await myModel.find({}, 'attributes.name');
}

更新:

所以这似乎对我有用。我仍在尝试进行进一步的测试,以确保它的行为符合预期。

const mongoReply = await cuk.aggregate([
            {
                $match: {$and: [{'attributes.name' : 'color'}, {'attributes.name' : 'superpower'}]}
            },
            {
                $project: {
                    attributes: {
                        $filter: {
                            input: '$attributes',
                            as: 'attribute',
                            cond: {
                                $or : [ { $eq: [ '$$attribute.name', 'name'] },
                                    { $eq: [ '$$attribute.name', 'crypto_length'] }
                                ]
                            }
                        }
                    }
                }

            }
        ])

1 个答案:

答案 0 :(得分:0)

查询应如下所示:-

await MyModel.find({ "attributes.name": "x", "attributes.value": "y" })
             .select(["attributes.name", "attributes.value"])

您可以在https://mongoosejs.com/docs/api.html#query_Query-select

上了解更多有关选择的信息。