mongo 基于条件的数据库更新脚本
mongo db update script based on condition
我有一个名为 School
的 mongo 数据库集合。示例数据如下所示。
{
"_id" = ObjectId("5349b4ddd2781d08c09890f4"),
"school": [
{
"Class": [
{
"Name":{
"Subject": [
"C",
"A"
]
}
}
]
}
]
},
{
"_id" = ObjectId("5349b4ddd2781d08c09890f5"),
"school": [
{
"Class": [
{
"Name": {
"Subject": [
"B",
"A",
"C"
]
}
}
]
}
]
},
{
"_id" = ObjectId("5349b4ddd2781d08c09890f6"),
"school": [
{
"Class": [
{
"Name": {
"Subject": [
]
}
}
]
}
]
},
{
"_id" = ObjectId("5349b4ddd2781d08c09890f7"),
"school": [
{
"Class": [
{
"Name": {
"Subject": [
"C"
]
}
}
]
}
]
},
{
"_id" = ObjectId("5349b4ddd2781d08c09890f8"),
"school": [
{
"Class": [
{
"Name": {
"Subject":[
"A"
]
}
}
]
}
]
}
Subject
列表中只能有 2 个主题 A
和 B
。我需要编写一个脚本来检查除 A
和 B
之外是否还有其他主题,然后它将删除它。如果只有 A
和 C
两个主题,那么 C
将更新为 B
。如果只有 1 个主题 C
,则它将被替换为 B
。如果 Subject
不包含值或 Subject
仅包含 A
.
,则保持原样
这就是我试图获取相关数据进行更新但不确定如何在具有上述条件的 Mongo 数据库中更新它
db.getCollection("School").find(
{
"$and": [
{"school.Class.Name.Subject": {
"$ne":null
}
},
{"school.Class.Name.Subject": {
"$in":[
"C"
]
}
}
]
}
);
数据模型使这有点复杂。我的示例首先过滤 "Subject"
数组中只有 "C"
的文档,然后在管道中,它深入到具有多个 "$map"
的结构,直到达到 "Subject"
。此处,"Subject"
代码检查 "C"
,如果是,则用 "B"
替换。所有代码都用 "$setUnion"
聚合,因此不会出现重复。 update
需要最后的 "multi"
,但可以使用 updateMany
。
db.collection.update({
// Only need to update where "C" is present
"school.Class.Name.Subject": "C"
},
[
{
// Recreate school taking care of "C"
"$set": {
"school": {
"$map": {
"input": "$school",
"as": "class",
"in": {
"Class": {
"$map": {
"input": "$$class.Class",
"as": "name",
"in": {
"Name": {
"Subject": {
"$setUnion": {
"$map": {
"input": "$$name.Name.Subject",
"as": "code",
"in": {
"$cond": [
{ "$eq": [ "$$code", "C" ] },
"B",
"$$code"
]
}
}
}
}
}
}
}
}
}
}
}
}
}
],
{
// Do all docs (or use updateMany, etc.)
"multi": true
})
在 mongoplayground.net 上试一试。
我有一个名为 School
的 mongo 数据库集合。示例数据如下所示。
{
"_id" = ObjectId("5349b4ddd2781d08c09890f4"),
"school": [
{
"Class": [
{
"Name":{
"Subject": [
"C",
"A"
]
}
}
]
}
]
},
{
"_id" = ObjectId("5349b4ddd2781d08c09890f5"),
"school": [
{
"Class": [
{
"Name": {
"Subject": [
"B",
"A",
"C"
]
}
}
]
}
]
},
{
"_id" = ObjectId("5349b4ddd2781d08c09890f6"),
"school": [
{
"Class": [
{
"Name": {
"Subject": [
]
}
}
]
}
]
},
{
"_id" = ObjectId("5349b4ddd2781d08c09890f7"),
"school": [
{
"Class": [
{
"Name": {
"Subject": [
"C"
]
}
}
]
}
]
},
{
"_id" = ObjectId("5349b4ddd2781d08c09890f8"),
"school": [
{
"Class": [
{
"Name": {
"Subject":[
"A"
]
}
}
]
}
]
}
Subject
列表中只能有 2 个主题 A
和 B
。我需要编写一个脚本来检查除 A
和 B
之外是否还有其他主题,然后它将删除它。如果只有 A
和 C
两个主题,那么 C
将更新为 B
。如果只有 1 个主题 C
,则它将被替换为 B
。如果 Subject
不包含值或 Subject
仅包含 A
.
这就是我试图获取相关数据进行更新但不确定如何在具有上述条件的 Mongo 数据库中更新它
db.getCollection("School").find(
{
"$and": [
{"school.Class.Name.Subject": {
"$ne":null
}
},
{"school.Class.Name.Subject": {
"$in":[
"C"
]
}
}
]
}
);
数据模型使这有点复杂。我的示例首先过滤 "Subject"
数组中只有 "C"
的文档,然后在管道中,它深入到具有多个 "$map"
的结构,直到达到 "Subject"
。此处,"Subject"
代码检查 "C"
,如果是,则用 "B"
替换。所有代码都用 "$setUnion"
聚合,因此不会出现重复。 update
需要最后的 "multi"
,但可以使用 updateMany
。
db.collection.update({
// Only need to update where "C" is present
"school.Class.Name.Subject": "C"
},
[
{
// Recreate school taking care of "C"
"$set": {
"school": {
"$map": {
"input": "$school",
"as": "class",
"in": {
"Class": {
"$map": {
"input": "$$class.Class",
"as": "name",
"in": {
"Name": {
"Subject": {
"$setUnion": {
"$map": {
"input": "$$name.Name.Subject",
"as": "code",
"in": {
"$cond": [
{ "$eq": [ "$$code", "C" ] },
"B",
"$$code"
]
}
}
}
}
}
}
}
}
}
}
}
}
}
],
{
// Do all docs (or use updateMany, etc.)
"multi": true
})
在 mongoplayground.net 上试一试。