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回答

Stannum

2019-12-29

同学你好~我返回去看了一下课程中演示的代码,复制文档的完整代码是这样的:

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重复这种错误的。建议你再检查一下运行的语句。如果还有其他问题,我们再探讨~

1
1
大西瓜瓜瓜瓜
非常感谢!
2019-12-29
共1条回复

玩转MongoDB4.0(最新版) 从入门到实践

30%理论+70%实战,用实操检验真理,一门让你事半功倍的入门进阶课

1138 学习 · 197 问题

查看课程