Mongodb 聚合=[ find-$lookup-$match-$check and $update]
Mongodb Aggregation=[ find-$lookup-$match-$check and $update]
我是 Mongodb 初学者,我在数据库中有两个集合(关系):
供应商合集:
首先,我需要用电子邮件搜索文档,然后在子文档中找到 Expired 字段值为 false 的 stats_ID,然后用这些 stats_id**[=13 搜索另一个集合=]
{
"_id": {
"$oid": "6229d3cfdbfc81a8777e4821"
},
"stats": [
{
"stats_ID": {
"$oid": "62289ded8079821eb24760e0"
},
"New": false,
"Expired": false
},
{
"stats_ID": {
"$oid": "6228a252fb4554dd5c48202a"
},
"New": false,
"Expired": false
},
{
"stats_ID": {
"$oid": "622af1c391b290d34701af9f"
},
"New": false,
"Expired": false
}
],
"email": "man2996@gmail.com"
}
资料收集:
stats_ID(来自第一个收集结果)应与字段 _id 匹配的以下文档(例如,我只添加了一个文档)并检查创建日期早于今天的日期。如果创建日期大于数据收集的今天日期 _,则 stats_id(在供应商集合中)的过期值应更改为 true。
[
{
"_id": {
"$oid": "62289ded8079821eb24760e0"
},
"Main_ID": "JB-456765",
"Expired": {
"$date": "2022-03-15T18:30:00Z"
}
}
]
我试过很多方法都没有得到想要的结果
我想我明白您想如何更新您的 vendors
文档。这是一种方法。
db.vendors.aggregate([
{ // match on email and some Expired is false
"$match": {
"email": "man2996@gmail.com",
"stats.Expired": false
}
},
{ // lookup data with matching _id
"$lookup": {
"from": "data",
"localField": "stats.stats_ID",
"foreignField": "_id",
"as": "data"
}
},
{ "$set": { // rebuild stats
"stats": {
"$map": {
"input": "$stats",
"as": "stat",
"in": { // is stats_ID somewhere in data?
"$cond": [
{ "$in": [ "$$stat.stats_ID", "$data._id" ] },
{ // Yes!
"$mergeObjects": [
"$$stat", // keep everything
{
"$cond": [ // check dates
{
"$gt": [
"$$NOW",
{
"$getField": {
"field": "Expired",
"input": {
"$first": {
"$filter": {
"input": "$data",
"as": "datum",
"cond": {
"$eq": [ "$$stat.stats_ID", "$$datum._id" ]
}
}
}
}
}
}
]
},
{ // data Expired > NOW
"Expired": true
},
null // data Expired <= NOW
]
}
]
},
"$$stat" // No data._id==stats_ID, so keep
]
}
}
}
}
},
{ // don't need data anymore
"$unset": [ "data" ]
},
{ // update doc
"$merge": { "into": "vendors" }
}
])
在 mongoplayground.net 上试用。
我是 Mongodb 初学者,我在数据库中有两个集合(关系):
供应商合集:
首先,我需要用电子邮件搜索文档,然后在子文档中找到 Expired 字段值为 false 的 stats_ID,然后用这些 stats_id**[=13 搜索另一个集合=]
{
"_id": {
"$oid": "6229d3cfdbfc81a8777e4821"
},
"stats": [
{
"stats_ID": {
"$oid": "62289ded8079821eb24760e0"
},
"New": false,
"Expired": false
},
{
"stats_ID": {
"$oid": "6228a252fb4554dd5c48202a"
},
"New": false,
"Expired": false
},
{
"stats_ID": {
"$oid": "622af1c391b290d34701af9f"
},
"New": false,
"Expired": false
}
],
"email": "man2996@gmail.com"
}
资料收集:
stats_ID(来自第一个收集结果)应与字段 _id 匹配的以下文档(例如,我只添加了一个文档)并检查创建日期早于今天的日期。如果创建日期大于数据收集的今天日期 _,则 stats_id(在供应商集合中)的过期值应更改为 true。
[
{
"_id": {
"$oid": "62289ded8079821eb24760e0"
},
"Main_ID": "JB-456765",
"Expired": {
"$date": "2022-03-15T18:30:00Z"
}
}
]
我试过很多方法都没有得到想要的结果
我想我明白您想如何更新您的 vendors
文档。这是一种方法。
db.vendors.aggregate([
{ // match on email and some Expired is false
"$match": {
"email": "man2996@gmail.com",
"stats.Expired": false
}
},
{ // lookup data with matching _id
"$lookup": {
"from": "data",
"localField": "stats.stats_ID",
"foreignField": "_id",
"as": "data"
}
},
{ "$set": { // rebuild stats
"stats": {
"$map": {
"input": "$stats",
"as": "stat",
"in": { // is stats_ID somewhere in data?
"$cond": [
{ "$in": [ "$$stat.stats_ID", "$data._id" ] },
{ // Yes!
"$mergeObjects": [
"$$stat", // keep everything
{
"$cond": [ // check dates
{
"$gt": [
"$$NOW",
{
"$getField": {
"field": "Expired",
"input": {
"$first": {
"$filter": {
"input": "$data",
"as": "datum",
"cond": {
"$eq": [ "$$stat.stats_ID", "$$datum._id" ]
}
}
}
}
}
}
]
},
{ // data Expired > NOW
"Expired": true
},
null // data Expired <= NOW
]
}
]
},
"$$stat" // No data._id==stats_ID, so keep
]
}
}
}
}
},
{ // don't need data anymore
"$unset": [ "data" ]
},
{ // update doc
"$merge": { "into": "vendors" }
}
])
在 mongoplayground.net 上试用。