Я новичок в Mongodb, у меня есть две коллекции (реляционные) в базе данных:
коллекция продавцов:
Во-первых, мне нужно найти документ с электронной почтой, а затем найти stats_ID, значение поля Expired которого является ложным в поддокументе, и выполнить поиск в другой коллекции с этим stats_id**
{
"_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": "[email protected]"
}
Сбор информации:
stats_ID (из первого результата сбора) должен соответствовать приведенному ниже документу (например, я добавил только один документ) с полем _id и проверить, что дата создания больше, чем сегодняшняя дата. если дата создания больше, чем сегодняшняя дата сбора данных _, то значение Expired 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": "[email protected]",
"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.
Здравствуйте, у меня две коллекции. Оба имеют массив полей с одинаковым именем. Мне нужно сравнить эти два поля и дать оценку совпадения 100. Возможно ли это, сэр?
@ManiShankar Я уверен, что это возможно. Если после попытки и у вас возникли трудности, вы можете опубликовать новый вопрос.
«если дата создания больше, чем сегодняшняя дата…, то значение Expired… должно измениться на true». Дата создания в будущем истекла? Действительно?