mongodb - 开始使用mongo 发现一个问题,很难描述,请慢慢看代码

浏览:39日期:2023-07-17

问题描述

db.mongo.insert({name:’mongo’});> var t=db.mongo.findOne();> t{ '_id' : ObjectId('5141b98723616e67f947f356'), 'name' : 'mongo' }> var d=t > d{ '_id' : ObjectId('5141b98723616e67f947f356'), 'name' : 'mongo' }> d.password=123123> d{'_id' : ObjectId('5141b98723616e67f947f356'),'name' : 'mongo','password' : 123}> t{'_id' : ObjectId('5141b98723616e67f947f356'),'name' : 'mongo','password' : 123}

问题1

var d = t

是引用赋值吗 如果是的话,怎么样不使用引用赋值

delete d.passwordtrue> d{ '_id' : ObjectId('5141b98723616e67f947f356'), 'name' : 'mongo' }> d.password=124124> d{'_id' : ObjectId('5141b98723616e67f947f356'),'name' : 'mongo','password' : 124,'password' : 124}

问题2 我执行

delete d.password

返回 true 说明已经删除,为什么我再执行

d.password=124

会执行两次添加

> d{'_id' : ObjectId('5141b98723616e67f947f356'),'name' : 'mongo','password' : 124,'password' : 124}

刚开始接触 不是很明白,希望有知道的说明下原因

问题解答

回答1:

第一个问题 ... 因为两个条目有同样的 ObjectId 所以视为是同一条 ...

虽然事实上不是引用赋值但你可以这么理解 ...

第二个问题无法复现所以不知 ...

回答2:

这不是ObjectId相同的问题,就是单纯的javascript语法要求引用赋值。如果你想clone,看这个吧。http://stackoverflow.com/questions/122102/most-efficient-way-to-clone-an-object

同样没有遇到第二个问题。

回答3:

对的,这个是单纯的Javascript语法的问题。在Javascript中是存在这个问题的。即深复制和浅复制的问题:

var cloneObj = function(obj){ var str, newobj = obj.constructor === Array ? [] : {}; if(typeof obj !== ’object’){return; } else if(window.JSON){str = JSON.stringify(obj), //系列化对象newobj = JSON.parse(str); //还原 } else {for(var i in obj){ newobj[i] = typeof obj[i] === ’object’ ? cloneObj(obj[i]) : obj[i]; } } return newobj;};

代码转自https://www.zhihu.com/question/23031215

相关文章: