问题
My collection schema is as follows:
Product
{
_id: ObjectId(), // default mongo db id
specification: [
{key: 'Name', value: "value 1"},
{key: 'Category', value: "value 2"},
{key: 'Department', value: "value 3"}
]
}
Now I want to query on this with a generic filter. For example,
- Get me all product with
Name = value 1
andCategory in [value 2, value 3]
andDepartment = value 3
- Get me all product with
Name = value 1
orCategory = value 2
orDepartment in [value 3, value 4]
I have been trying to use $match
with $elemMatch
. But that only allows only one query but I am not able to use the $and
and $or
operator.
回答1:
You can use $elemMatch
just fine, you just have to put $and
/ $or
at the top level.
Your first example would be
db.products.find({
$and: [
{
specification: {
$elemMatch: { key: 'Name', value: 'value 1' }
}
},
{
specification: {
$elemMatch: { key: 'Category', value: { $in: ['value 1', 'value 2'] } }
}
},
{
specification: {
$elemMatch: { key: 'Department', value: 'value 3' }
}
}
]
})
来源:https://stackoverflow.com/questions/61614866/mongo-db-aggregation-with-array-of-objects