如何解决MongoDB条件关系查询
MongoDB 4.2.2,
我有2个投票和投票集合,我需要从“投票”集合中抓取字段voter_selection
并将其添加到投票中,但前提是某些条件匹配poll_id
和voter_id
>
用户:
{
"_id" : ObjectId("5f867e0d126ddbde24d6ee73"),"name" : "Jaskson"
"age" : "24"
}
投票:
{
"_id" : ObjectId("5f87d988ddae726a3dbe5459"),"name" : "RedVsWhite"
},{
"_id" : ObjectId("5f51408ffc1d0437fa31d6f7"),"name" : "ApplesVsOrange","total_votes" : "0",}
投票:
{
"_id" : ObjectId("5f864addddae726a3dbe53de"),"voter_id" : ObjectId("5f867e0d126ddbde24d6ee73"),//this is the id of the person
"poll_id" : ObjectId("5f87d988ddae726a3dbe5459"),//this is the poll id
"voter_selection" : "red"
}
我需要这个结果:
{
"_id" : ObjectId("5f87d988ddae726a3dbe5459"),"name" : "RedVsWhite","voter_selection" : red // show this if it finds votes with this _id and also if user_id match & voter_id
},"total_votes" : "0"
/// dont show voter_selection if nothing match with voter_id and poll_id
}
此查询有效,但问题是,如果没有匹配项,则不会显示民意测验行,而我需要的是即使没有匹配项也要获得所有民意测验,但是如果有匹配项,请添加字段{{1} }移至该行
voter_selection
解决方法
-
$group
设置为空,并形成根所有元素的数组 -
$lookup
与VotesRecords
加入收藏并获取用户详细信息 -
$unwind
解构VotesRecords
数组 -
$project
迭代遍历$map
数组上的root
,并检查条件是否匹配poll_id
,然后返回voter_selection
,否则不使用 -
$unwind
解构根数组 -
$replaceWith
替换根中的root
对象
db.getCollection("Polls").aggregate([
{
$group: {
_id: null,root: { $push: "$$ROOT" }
}
},{
$lookup: {
from: "VotesRecords",as: "VotesRecords",pipeline: [{ $match: { voter_id: ObjectId("5f867e0d126ddbde24d6ee73") } }]
}
},{
"$unwind": {
"path": "$VotesRecords","preserveNullAndEmptyArrays": true
}
},{
$project: {
root: {
$map: {
input: "$root",in: {
$mergeObjects: [
"$$this",{
$cond: [
{ $eq: ["$$this._id","$VotesRecords.poll_id"] },{ voter_selection: "$VotesRecords.voter_selection" },{}
]
}
]
}
}
}
}
},{ $unwind: "$root" },{ $replaceWith: "$root" }
])
第二种方法,您可以在管道之后添加以下更改,
-
$project
显示voter_selection
,如果voter_id
匹配,否则显示$$REMOVE
-
$group
by_id
,并使用$mergeObjects
从众多对象中获取唯一对象
-
$replaceWith
替换根对象
// <= skipping your pipelines here
{
"$project": {
"_id": "$_id","name": "$name","total_votes": 1,"voter_selection": {
$cond: [
{ $eq: ["$VotesRecords.voter_id",ObjectId("5f867e0d126ddbde24d6ee73")] },"$VotesRecords.voter_selection","$$REMOVE"
]
}
}
},{
$group: {
_id: "$_id",root: { $mergeObjects: "$$ROOT" }
}
},{ $replaceWith: "$root" }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。