【发布时间】:2020-03-27 12:58:26
【问题描述】:
https://mongoplayground.net/p/dsMlfEdSkXP
我想查询广播者用户支持的文档。在链接中,broadcasterUser id 是“23435553”
在结果中,不应返回带有 "_id": ObjectId("5e7d7c35d86d85088863f4df")" 的文档,因为广播公司的 voteType 是 "downVote"。
应该返回带有“_id”的文档:ObjectId(“5e7d7c47d86d85088863f4e0”),因为广播者的voteType是“upVote”。
为什么我的 $match 条件不起作用?
{
$match: {
"votes.user.id": "23435553",
"votes.voteType": "upVote",
}
}
编辑:找到我的答案,谢谢@prasad。 https://mongoplayground.net/p/I_W0_BIIVVO
db.suggestions.aggregate([
{
$match: {
"channelId": "23435553",
}
},
{
$lookup: {
from: "votes",
localField: "_id",
foreignField: "suggestionId",
as: "votes"
}
},
{
$match: {
"votes": {
"$elemMatch": {
"user.id": "23435553",
"voteType": "upVote",
}
},
}
},
])
我没有尝试进行任何数组过滤。我试图根据数组中对象的存在来过滤 文档。
第二个 $match 运算符所需的逻辑是“查找建议文档,其中在 votes 数组中存在 user.id="23435553" AND voteType="upVote" 的对象。
【问题讨论】:
-
这能回答你的问题吗? Retrieve only the queried element in an object array in MongoDB collection 您需要使用
filter从数组中返回所需的元素,一般来说,如果您使用$match,如果至少有一个元素符合条件,它将返回整个数组(最终是相应的文档)!!跨度> -
嗯,我不是要过滤
votes数组。我试图排除文档本身,因为广播公司的反对票出现在votes数组中,如果这有意义的话。 -
对数组中的子文档指定多个条件时,必须使用$elemMatch - Specify Multiple Conditions for Array of Documents。
-
@EricGuan :如果我理解正确,您是否希望基于数组返回更少的元素,而不是取决于少数条件正确(此外,如果在投票数组中不匹配 - 整个文档也可以从结果中删除)?如果是 - 那么
$filter应该适合您,您尝试过还是需要查询? -
@whoami 对不起,没有。我想过滤文档,而不是数组。但过滤逻辑需要在数组中搜索匹配多个条件的特定对象。
标签: mongodb