我有以下猫鼬模式:
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'] }
]
}
}
}
}
}
])
答案 0 :(得分:0)
查询应如下所示:-
await MyModel.find({ "attributes.name": "x", "attributes.value": "y" })
.select(["attributes.name", "attributes.value"])
上了解更多有关选择的信息。