如果任何嵌套数组项满足mongoDB中的条件,则投影布尔值



下面是我的集合的示例结构

{
"_id" : ObjectId("5f631d6f3792ae9ce5e35ddd"),
"from" : "kathy",
"content" : "hello",
"to" : [ 
{
"name" : "david",
"isfavorite" : true
}, 
{
"name" : "james",
"isfavorite" : false
}, 
{
"name" : "steve",
"isfavorite" : true
}
]
}
{
"_id" : ObjectId("5f631d6f3792ae9ce5e35dde"),
"from" : "kathy",
"content" : "hey",
"to" : [ 
{
"name" : "david",
"isfavorite" : false
}, 
{
"name" : "john",
"isfavorite" : false
}, 
{
"name" : "roy",
"isfavorite" : true
}
]
}

我正在尝试获取某个人收到的信息。在这种情况下,如果我们展示史蒂夫的信息,我需要知道它是否被他设置为最喜欢的。我需要的是在外部文档本身上投影favorite标志,如果它匹配某些条件

我试过这个,但没有工作

db.getCollection('Messages_Collection').aggregate([
{
$match:
{
"to":
{
$elemMatch:
{
"name":"steve"
}
}
}

},
{
$project:
{
"_id":1,
"from":1,
"to":1,
"isfavorite":
{
$cond:
{
if:
{
"$to":
{
$elemMatch:
{
"isfavorite":true,
"name":"david"
}
},
then:true,
else:false
}
}
}
}
}])

Mongo版本:4.0.13

您可以简单地使用$filter来筛选特定的人并获取。

[
{
$match: {
"to.name": "steve"
}
},
{
$addFields: {
isfavorite: {
"$arrayElemAt": [
{
$filter: {
input: "$to",
cond: {
$eq: [
"$$this.name",
"steve"
]
}
}
},
0
]
}
}
},
{
$addFields: {
isfavorite: "$isfavorite.isfavorite"
}
}
]

工作Mongo游乐场

最新更新