搜尋

首頁  >  問答  >  主體

mongodb - 開始使用mongo 發現一個問題,很難描述,請慢慢看程式碼

 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=123
123
> d
{
	"_id" : ObjectId("5141b98723616e67f947f356"),
	"name" : "mongo",
	"password" : 123
}
> t
{
	"_id" : ObjectId("5141b98723616e67f947f356"),
	"name" : "mongo",
	"password" : 123
}

問題1

var d = t

是引用賦值嗎 如果是的話,怎麼樣不使用引用賦值

delete d.password
true
> d
{ "_id" : ObjectId("5141b98723616e67f947f356"), "name" : "mongo" }
> d.password=124
124
> 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
}

剛開始接觸 不是很明白,希望有知道的說明下原因

ringa_leeringa_lee2823 天前660

全部回覆(3)我來回復

  • 高洛峰

    高洛峰2017-04-21 11:18:56

    第一個問題 ... 因為兩個條目有相同的 ObjectId 所以視為是同一條 ...

    雖然事實上不是引用賦值但你可以這麼理解 ...

    第二個問題無法復現所以不知 ...

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-21 11:18:56

    這不是ObjectId相同的問題,就是單純的javascript語法要求引用賦值。如果你想clone,看這個吧。 http://stackoverflow.com/questions/122102/most-efficient-way-to-clone-an-object

    同樣沒有遇到第二個問題。

    回覆
    0
  • 迷茫

    迷茫2017-04-21 11:18:56

    對的,這個是單純的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

    回覆
    0
  • 取消回覆