问题描述
我有一个对象数组,我想检查是否存在匹配多个属性的对象.我已经尝试过使用$in
和$and
,但是它不能按照我想要的方式工作.
I have an array of objects and I want to check if there is an object that matches multiple properties. I have tried using $in
and $and
but it does not work the way I want it to.
我有一个像这样的数组
"choices": [
{
"name": "choiceA",
"id": 0,
"l": "k"
},
{
"name": "choiceB",
"id": 1,
"l": "j"
},
{
"name": "choiceC",
"id": 2,
"l": "l"
}
]
我正在尝试编写聚合代码,以检查是否存在同时包含"id":2
和"l":"j"
属性的对象.我当前的实现检查是否有一个对象包含第一个属性,然后检查是否有一个对象包含第二个属性.
I am trying to write aggregation code that can check if there is an object that contains both "id":2
and "l":"j"
properties. My current implementation checks if there is an object containing the first property then checks if there is an object containing the second one.
我如何获得想要的结果?
How can I get my desired results?
下面,请参阅我的聚合查询.完整代码为此处
Below, see my aggregation query. The full code is here
db.poll.aggregate([
{
"$match": {
"_id": 100
}
},
{
$project: {
numberOfVotes: {
$and: [
{
$in: [
2,
"$choices.id"
]
},
{
$in: [
"j",
"$choices.l"
]
}
]
},
}
}
])
上面的查询返回true,但属性id:2
和"l":"J"
的数组中都没有对象.我知道代码按预期工作.我怎样才能得到想要的结果?
The above query returns true yet there is no object in the array both of the properties id:2
and "l":"J"
. I know the code works as expected. How can I get my desired results?
推荐答案
您要使用 $ elemMatch
db.collection.find({
choices: {
$elemMatch: {
id: 2,
l: "j"
}
}
})
编辑
在聚合$project
阶段,我将使用 $ filter
In an aggregation $project
stage I would use $filter
db.poll.aggregate([
{
"$match": {
"_id": 100
}
},
{
$project: {
numberOfVotes: {
$gt: [
{
$size: {
$filter: {
input: "$choices",
as: "choice",
cond: {
$and: [
{
$eq: [
"$$choice.id",
2
]
},
{
$eq: [
"$$choice.l",
"j"
]
}
]
}
}
}
},
0
]
}
}
}
])
这篇关于MongoDB聚合:如何检查数组中是否存在包含多个属性的对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!