3-14课这里的17:28附近有一个错误
来源:3-14 【更新文档】动手实战 - 一大波更新操作符

大西瓜瓜瓜瓜
2019-12-17
老师你好:
您原来的代码是:
db.accounts.find({ name: "karen" }).forEach(function (doc) {
var temp = doc
temp.name = "lawrence"
})
我实际运行是得不到结果,并且没有任何报错的。
后来我使用我自己的方法侦测出是_id重复了。
改成这样子才能正确得到结果
try {
db.accounts.find({ name: "karen" }).forEach(function (doc) {
var temp = { ...doc }
temp.name = "lawrence"
// temp._id = null
// temp.forEach(function (item) {
// printjson(item)
// })
let newTemp = {}
for (const key in temp) {
if (temp.hasOwnProperty(key)) {
const element = temp[key];
if (key !== '_id')
newTemp[key] = element
}
}
printjson(newTemp)
var result = db.accounts.insert(newTemp)
printjson(result)
})
} catch (error) {
print(error)
}
写回答
1回答
-
同学你好~我返回去看了一下课程中演示的代码,复制文档的完整代码是这样的:
db.accounts.find(
{ name: "karen" },
{ _id: 0}
).forEach( function(doc) {
var newDoc = doc;
newDoc.name = "lawrence";
db.accounts.insert(newDoc);
}
)
请注意我们在find命令中所提供的第二个参数{ _id: 0 },这个参数是一个投影的命令,也就是说,我们要把文档主键_id从find命令筛选出的文档中隐去(注意这里只是不显示在查找结果中,并没有从集合中的文档中删去_id)。这样一来,在后续的操作中,newDoc所指向的文档中是没有_id这个字段的。当我们将一个不包含_id字段的文档用insert命令写入数据库时,mongoDB会自动生成一个对象主键作为_id字段,这样可以确保新建文档的_id不和已有文档冲突。
我不太清楚你自己运行的语句是否和课程中写的完全一样?如果完全一样,应该是不会导致_id重复这种错误的。建议你再检查一下运行的语句。如果还有其他问题,我们再探讨~
112019-12-29
相似问题