mongodb - $set 不设置嵌套值
问题描述
我正在尝试$set
使用findOneAndUpdate
,但我的嵌套值设置不正确。
这是我的SCHEMA的片段:
...
courseMap: {
hasCourseMap: { type: Boolean, default: false },
parentMap: { type: Schema.Types.ObjectId, ref: "CourseMap" },
colleges: [
{
name: { type: String },
_id: { type: Schema.Types.ObjectId, ref: "College" }
}
],
title: { type: String },
ninth: {
hsCourses: [
{
courseName: { type: String, required: true },
courseNumber: { type: String, required: true },
_id: {
type: Schema.Types.ObjectId,
ref: "HighSchoolCourse",
autopopulate: true
}
}
],
collegeCourses: [
{
name: {
type: String,
required: true
},
courseNumber: { type: String, required: true },
description: { type: String },
courseCode: { type: String, required: true },
_id: {
type: Schema.Types.ObjectId,
ref: "CollegeCourse",
autopopulate: true
}
}
],
skills: []
},
tenth: {
hsCourses: [
{
courseName: { type: String, required: true },
courseNumber: { type: String, required: true },
_id: {
type: Schema.Types.ObjectId,
ref: "HighSchoolCourse",
autopopulate: true
}
}
],
collegeCourses: [
{
name: {
type: String,
required: true
},
courseNumber: { type: String, required: true },
description: { type: String },
courseCode: { type: String, required: true },
_id: {
type: Schema.Types.ObjectId,
ref: "CollegeCourse",
autopopulate: true
}
}
],
skills: []
},
eleventh: {
hsCourses: [
{
courseName: { type: String, required: true },
courseNumber: { type: String, required: true },
_id: {
type: Schema.Types.ObjectId,
ref: "HighSchoolCourse",
autopopulate: true
}
}
],
collegeCourses: [
{
name: {
type: String,
required: true
},
courseNumber: { type: String, required: true },
description: { type: String },
courseCode: { type: String, required: true },
_id: {
type: Schema.Types.ObjectId,
ref: "CollegeCourse",
autopopulate: true
}
}
],
skills: []
},
twelfth: {
hsCourses: [
{
courseName: { type: String, required: true },
courseNumber: { type: String, required: true },
_id: {
type: Schema.Types.ObjectId,
ref: "HighSchoolCourse",
autopopulate: true
}
}
],
collegeCourses: [
{
name: {
type: String,
required: true
},
courseNumber: { type: String, required: true },
description: { type: String },
courseCode: { type: String, required: true },
_id: {
type: Schema.Types.ObjectId,
ref: "CollegeCourse",
autopopulate: true
}
}
],
skills: []
},
year5: {
hsCourses: [
{
courseName: { type: String, required: true },
courseNumber: { type: String, required: true },
_id: {
type: Schema.Types.ObjectId,
ref: "HighSchoolCourse",
autopopulate: true
}
}
],
collegeCourses: [
{
name: {
type: String,
required: true
},
courseNumber: { type: String, required: true },
description: { type: String },
courseCode: { type: String, required: true },
_id: {
type: Schema.Types.ObjectId,
ref: "CollegeCourse",
autopopulate: true
}
}
],
skills: []
}
}
...
这是我的update
对象:
{
"$set": {
"courseMap": {
"hasCourseMap": true,
"parentMap": "5e07fb5b40b723f03935cb31",
"colleges": [
{
"_id": "5dfee8128eacd562f0338678",
"name": "Eastfield"
},
{
"_id": "5e06a566559c3013687cc0f1",
"name": "University of North Texas at Dallas"
}
],
"ninth": {
"hsCourses": [
{
"_id": "5dfee4bb008dfb2fa4e89a43",
"abbr": "MATH",
"courseNumber": "7897987",
"courseName": "GEOMETRY",
"timestamp": "2019-12-22T03:36:27.026Z",
"__v": 0
}
],
"collegeCourses": [
{
"_id": "5dfef4d75581475988759efc",
"HSEquivCourses": [
"5dfee4bb008dfb2fa4e89a43"
],
"college": "5dfee8128eacd562f0338678",
"name": "test1",
"courseNumber": "test",
"description": "tesst",
"__v": 0
}
]
},
"tenth": {
"hsCourses": [
{
"_id": "5dfee4bb008dfb2fa4e89a43",
"abbr": "MATH",
"courseNumber": "7897987",
"courseName": "GEOMETRY",
"timestamp": "2019-12-22T03:36:27.026Z",
"__v": 0
}
],
"collegeCourses": [
{
"_id": "5e07dceb63b72fe4b74473e2",
"college": "5e06a566559c3013687cc0f1",
"name": "TEST",
"courseNumber": "tesat",
"description": "",
"courseCode": "test",
"__v": 0
}
]
},
"eleventh": {
"hsCourses": [
{
"_id": "5dfee4bb008dfb2fa4e89a43",
"abbr": "MATH",
"courseNumber": "7897987",
"courseName": "GEOMETRY",
"timestamp": "2019-12-22T03:36:27.026Z",
"__v": 0
}
],
"collegeCourses": [
{
"_id": "5dfef06ebe4ae31e7c6344bb",
"HSEquivCourses": [
"5dfee4bb008dfb2fa4e89a43"
],
"college": "5dfee8128eacd562f0338678",
"name": "Psychology",
"courseNumber": "1301",
"description": "test",
"__v": 0
}
]
},
"twelfth": {
"hsCourses": [
{
"_id": "5dfee4bb008dfb2fa4e89a43",
"abbr": "MATH",
"courseNumber": "7897987",
"courseName": "GEOMETRY",
"timestamp": "2019-12-22T03:36:27.026Z",
"__v": 0
}
],
"collegeCourses": [
{
"_id": "5e07dceb63b72fe4b74473e2",
"college": "5e06a566559c3013687cc0f1",
"name": "TEST",
"courseNumber": "tesat",
"description": "",
"courseCode": "test",
"__v": 0
}
]
},
"year5": {
"hsCourses": [
{
"_id": "5dfee4bb008dfb2fa4e89a43",
"abbr": "MATH",
"courseNumber": "7897987",
"courseName": "GEOMETRY",
"timestamp": "2019-12-22T03:36:27.026Z",
"__v": 0
}
],
"collegeCourses": [
{
"_id": "5dfef06ebe4ae31e7c6344bb",
"HSEquivCourses": [
"5dfee4bb008dfb2fa4e89a43"
],
"college": "5dfee8128eacd562f0338678",
"name": "Psychology",
"courseNumber": "1301",
"description": "test",
"__v": 0
}
]
}
}
}
}
并且使用后StudentProfile.findOneAndUpdate({ _id: user.profile }, update)
以下是更新的,这是顶级键值,但我的嵌套值没有设置。
"courseMap":{
"hasCourseMap" : true,
"parentMap" : ObjectId("5e07fb5b40b723f03935cb31"),
"colleges" : [
{
"_id" : ObjectId("5dfee8128eacd562f0338678"),
"name" : "Eastfield"
},
{
"_id" : ObjectId("5e06a566559c3013687cc0f1"),
"name" : "University of North Texas at Dallas"
}
],
"ninth" : {
"hsCourses" : [
{
}
],
"collegeCourses" : [
{
}
]
},
"tenth" : {
"hsCourses" : [
{
}
],
"collegeCourses" : [
{
}
]
},
"eleventh" : {
"hsCourses" : [
{
}
],
"collegeCourses" : [
{
}
]
},
"twelfth" : {
"hsCourses" : [
{
}
],
"collegeCourses" : [
{
}
]
},
"year5" : {
"hsCourses" : [
{
}
],
"collegeCourses" : [
{
}
]
}
}
这是更新发生之前的文档片段:
...
"courseMap" : {
"hasCourseMap" : false,
}
...
解决方案
你假设你想把所有东西都放进去$set
,这是不正确的。
您可以细分您的更新声明。
考虑以下示例,我从文档开始:
{
a: 1,
c: [
"1",
"2"
],
d: [
{
d1: "3",
d2: "4"
},
{
d3: "5"
}
],
e: {
e1: [
"6",
"7"
]
},
f: [
]
}
当我运行时:
db.inserter.updateOne({
},
{
$set: {
c: [
"3.3"
]
},
$push: {
f: {
d4: "5.5"
}
}
})
结果:
{
"_id": ObjectId("5e1de4b6afa8c2dd9dcfd79c"),
"a": 1,
"c": [
"3.3"
],
"d": [
{
"d1": "3",
"d2": "4"
},
{
"d3": "5"
}
],
"e": {
"e1": [
"6",
"7"
]
},
"f": [
{
"d4": "5.5"
}
]
}
诀窍?
更新文档有两部分(可能更多,你可以做点符号)$set 和 $push
{ $set : { c: ["3.3"] }, $push : { f: { d4: "5.5" } } }
按原样运行查询,它使用以下输出:
{
"_id" : ObjectId("5e1de61dafa8c2dd9dcfd79d"),
"courseMap" : {
"hasCourseMap" : true,
"parentMap" : "5e07fb5b40b723f03935cb31",
"colleges" : [
{
"_id" : "5dfee8128eacd562f0338678",
"name" : "Eastfield"
},
{
"_id" : "5e06a566559c3013687cc0f1",
"name" : "University of North Texas at Dallas"
}
],
"ninth" : {
"hsCourses" : [
{
"_id" : "5dfee4bb008dfb2fa4e89a43",
"abbr" : "MATH",
"courseNumber" : "7897987",
"courseName" : "GEOMETRY",
"timestamp" : "2019-12-22T03:36:27.026Z",
"__v" : 0
}
],
"collegeCourses" : [
{
"_id" : "5dfef4d75581475988759efc",
"HSEquivCourses" : [
"5dfee4bb008dfb2fa4e89a43"
],
"college" : "5dfee8128eacd562f0338678",
"name" : "test1",
"courseNumber" : "test",
"description" : "tesst",
"__v" : 0
}
]
},
"tenth" : {
"hsCourses" : [
{
"_id" : "5dfee4bb008dfb2fa4e89a43",
"abbr" : "MATH",
"courseNumber" : "7897987",
"courseName" : "GEOMETRY",
"timestamp" : "2019-12-22T03:36:27.026Z",
"__v" : 0
}
],
"collegeCourses" : [
{
"_id" : "5e07dceb63b72fe4b74473e2",
"college" : "5e06a566559c3013687cc0f1",
"name" : "TEST",
"courseNumber" : "tesat",
"description" : "",
"courseCode" : "test",
"__v" : 0
}
]
},
"eleventh" : {
"hsCourses" : [
{
"_id" : "5dfee4bb008dfb2fa4e89a43",
"abbr" : "MATH",
"courseNumber" : "7897987",
"courseName" : "GEOMETRY",
"timestamp" : "2019-12-22T03:36:27.026Z",
"__v" : 0
}
],
"collegeCourses" : [
{
"_id" : "5dfef06ebe4ae31e7c6344bb",
"HSEquivCourses" : [
"5dfee4bb008dfb2fa4e89a43"
],
"college" : "5dfee8128eacd562f0338678",
"name" : "Psychology",
"courseNumber" : "1301",
"description" : "test",
"__v" : 0
}
]
},
"twelfth" : {
"hsCourses" : [
{
"_id" : "5dfee4bb008dfb2fa4e89a43",
"abbr" : "MATH",
"courseNumber" : "7897987",
"courseName" : "GEOMETRY",
"timestamp" : "2019-12-22T03:36:27.026Z",
"__v" : 0
}
],
"collegeCourses" : [
{
"_id" : "5e07dceb63b72fe4b74473e2",
"college" : "5e06a566559c3013687cc0f1",
"name" : "TEST",
"courseNumber" : "tesat",
"description" : "",
"courseCode" : "test",
"__v" : 0
}
]
},
"year5" : {
"hsCourses" : [
{
"_id" : "5dfee4bb008dfb2fa4e89a43",
"abbr" : "MATH",
"courseNumber" : "7897987",
"courseName" : "GEOMETRY",
"timestamp" : "2019-12-22T03:36:27.026Z",
"__v" : 0
}
],
"collegeCourses" : [
{
"_id" : "5dfef06ebe4ae31e7c6344bb",
"HSEquivCourses" : [
"5dfee4bb008dfb2fa4e89a43"
],
"college" : "5dfee8128eacd562f0338678",
"name" : "Psychology",
"courseNumber" : "1301",
"description" : "test",
"__v" : 0
}
]
}
}
}
推荐阅读
- java - DevToolsActivePort 文件不存在 - chromedriver
- c# - 使用 Itextsharpdll 在 C# 中合并 PDF 时出错
- postgresql - 在数据库中存储经过的时间量的最方便的替代方法是什么?
- mysql - 如何在不与 sql 中的其他表比较的情况下显示不在表中的数据
- typescript - 如何在每个场景之前重新初始化量角器中的页面对象?
- reactjs - 在 ReactJS 中使用状态更新模拟多个 fetch 调用
- azure-active-directory - 如何在多租户场景中使用 Azure Active Directory 架构扩展
- webrtc - 带有 VPN 的 WebRTC ICE 在 Chrome 中工作,但在 Firefox 中失败
- java - Google 聊天卡 API 无法提及用户
- python - 基于列而不是行索引/索引的散景链接/刷亮