MongoDB通过检查key value是否存在来添加新字段



我有一个像这样的数据

[
{
"_id": "22435992",
"address": "Merr Street",
"contacted": [
{
"_id": "22435992",
"date": "2022-12-27T04:58:47.306Z",
"status": "Contacted",

},
{
"_id": "22435992",
"date": "2022-12-27T05:00:50.119Z",
"status": "Contacted",

},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:51.783Z",
"status": "Contacted",

},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:55.472Z",
"status": "Contacted",

},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:58.846Z",
"status": "Contacted",

},

],
"fullName": "Waltz",

},
{
"_id": "a2203725",
"address": "Youm Street",
"contacted": [
{
"_id": "22435992",
"date": "2022-12-27T04:58:47.306Z",
"status": "Contacted",

},
{
"_id": "22435992",
"date": "2022-12-27T05:00:50.119Z",
"status": "Contacted",

},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:51.783Z",
"status": "Contacted",

},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:55.472Z",
"status": "Contacted",

},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:58.846Z",
"status": "Contacted",

},

],
"fullName": "Bono",

},
{
"_id": "4f950467",
"address": "Sesame Streetm",
"contacted": [
{
"_id": "22435992",
"date": "2022-12-27T04:58:47.306Z",
"status": "Contacted",

},
{
"_id": "22435992",
"date": "2022-12-27T05:00:50.119Z",
"status": "Contacted",

},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:51.783Z",
"status": "Contacted",

},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:55.472Z",
"status": "Contacted",

},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:58.846Z",
"status": "Contacted",

},

],
"fullName": "Axl",

},
{
"_id": "3d338340",
"address": "Reign Street",
"contacted": [
{
"_id": "22435992",
"date": "2022-12-27T04:58:47.306Z",
"status": "Contacted",

},
{
"_id": "22435992",
"date": "2022-12-27T05:00:50.119Z",
"status": "Contacted",

},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:51.783Z",
"status": "Contacted",

},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:55.472Z",
"status": "Contacted",

},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:58.846Z",
"status": "Contacted",

},

],
"fullName": "Jean",

},

]

我想添加一个名为contactStatus的新字段其值来自于检查userId是否存在于已接触数组中因此它看起来像这样

[
{
"_id": "22435992",
"address": "Merr Street",
"contactStatus": "Contacted",
"contacted": [
{
"_id": "22435992",
"date": "2022-12-27T04:58:47.306Z",
"status": "Contacted"
},
{
"_id": "22435992",
"date": "2022-12-27T05:00:50.119Z",
"status": "Contacted"
},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:51.783Z",
"status": "Contacted"
},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:55.472Z",
"status": "Contacted"
},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:58.846Z",
"status": "Contacted"
}
],
"fullName": "Waltz"
},
{
"_id": "a2203725",
"address": "Youm Street",
"contactStatus": "Not Contacted",
"contacted": [
{
"_id": "22435992",
"date": "2022-12-27T04:58:47.306Z",
"status": "Contacted"
},
{
"_id": "22435992",
"date": "2022-12-27T05:00:50.119Z",
"status": "Contacted"
},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:51.783Z",
"status": "Contacted"
},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:55.472Z",
"status": "Contacted"
},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:58.846Z",
"status": "Contacted"
}
],
"fullName": "Bono"
},
{
"_id": "4f950467",
"address": "Sesame Streetm",
"contactStatus": "Contacted",
"contacted": [
{
"_id": "22435992",
"date": "2022-12-27T04:58:47.306Z",
"status": "Contacted"
},
{
"_id": "22435992",
"date": "2022-12-27T05:00:50.119Z",
"status": "Contacted"
},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:51.783Z",
"status": "Contacted"
},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:55.472Z",
"status": "Contacted"
},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:58.846Z",
"status": "Contacted"
}
],
"fullName": "Axl"
},
{
"_id": "3d338340",
"address": "Reign Street",
"contactStatus": "Not Contacted",
"contacted": [
{
"_id": "22435992",
"date": "2022-12-27T04:58:47.306Z",
"status": "Contacted"
},
{
"_id": "22435992",
"date": "2022-12-27T05:00:50.119Z",
"status": "Contacted"
},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:51.783Z",
"status": "Contacted"
},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:55.472Z",
"status": "Contacted"
},
{
"_id": "4f950467",
"date": "2022-12-27T09:33:58.846Z",
"status": "Contacted"
}
],
"fullName": "Jean"
}
]

我一直在尝试添加新字段,但它返回"Not contact "到所有的数据

db.collection.aggregate([
{
$addFields: {
contactStatus: {
$reduce: {
input: "$contacted",
initialValue: "$_id",
in: {
$cond: [
{
$eq: [
"$$this._id",
"$$value"
]
},
"$$this.status",
"Not Contacted"
]
}
}
}
}
}
])                          

这是我最近的尝试,它只给真假作为值,但由于有超过2个状态的状态,我不认为这个方法是正确的

db.collection.aggregate([
{
"$set": {
"contactStatus": {
"$in": [
"$_id",
"$contacted._id"
]
}
}
},
])

我不确定是否使用reduce,但我想不出任何其他方法来检查userId从接触数组,请帮助我

您选择$reduce的方法是明智的。您可以将initialValue设置为Not contact并将值更新为contacts只有在两个条件都满足的情况下。(即_id匹配且状态为contact)

db.collection.update({},
[
{
$set: {
contactStatus: {
"$reduce": {
"input": "$contacted",
"initialValue": "Not Contacted",
"in": {
"$cond": {
"if": {
$and: [
{
$eq: [
"$_id",
"$$this._id"
]
},
{
$eq: [
"$$this.status",
"Contacted"
]
}
]
},
"then": "Contacted",
"else": "$$value"
}
}
}
}
}
}
])

Mongo操场

最新更新