2017-05-07 27 views
1

嘗試從數組列表中刪除對象,然後將其保存到數據庫.splice()。儘管它正在拼接正確index但未正確保存,但如果我splice索引0,其實際刪除索引1在數據庫中,可能是因爲該對象已先拼接,因此它保存了錯誤的對象。NodeJs正確拼接陣列中的對象,但未刪除數據塊中的正確對象

var user = 
    { 
    "requests" : [ 
    { 
     "name" : "Test1", 
     "id" : "590e6c94b2d6e52674992d16", 
     "email" : "[email protected]", 
     "user" : "test", 
     "accepted" : false 
    }, 
    { 
     "name" : "Test2", 
     "id" : "590e6c8bb2d6e52674992d15", 
     "email" : "[email protected]", 
     "user" : "_test", 
     "accepted" : false 
    } 
] 
    } 

accepOrdeny對象例如,如果用戶test1發送一個請求到xUser -

{ 
    "name" : "Test1", 
    "id" : "590e6c94b2d6e52674992d16", 
    "email" : "[email protected]", 
    "user" : "test", 
    "accepted" : false 
} 

如果請求已被接受,accepted屬性boolean將切換到true並且如果拒絕,則accepted: false

{ 
    "name" : "Test1", 
    "id" : "590e6c94b2d6e52674992d16", 
    "email" : "[email protected]", 
    "user" : "test", 
    "accepted" : true 
} 

剪接它和節省

let xd = user.requests.indexOf(acceptOrdeny); 
user.requests.splice(xd, 1); 
user.save(callback); 

全碼邏輯 -

User.findOne({ _id: currUser._id }, function (err, user) { 
     if (err) throw err; 
     /* acceptOrdeny is the req.body object 
     checking if the key accepted==true then push acceptOrdeny object to friends[], splice from request[] then save to DB 
     */ 
     if (acceptOrdeny.accepted == true) { 

      user.friends.push(acceptOrdeny); 
      let indexReq = user.requests.indexOf(acceptOrdeny); 
      user.requests.splice(indexReq, 1); 
      user.save(callback); 
      console.log('accepted', indexReq) 
     } 
     /* 
     checking if the key accepted==false remove from requests[], then save current array[] list 
     */ 
     else { 
      let xd = user.requests.indexOf(acceptOrdeny); 
      user.requests.splice(xd, 1); 
      user.save(callback); 
     } 
    }); 

我已經測試splice對象手冊等,這是好的,但它們拼接動態使用indexOf不完全正確。

user.requests.splice(0, 1); // delete first obj in the array 'test1' 
user.requests.splice(1, 1); // delete 2nd obj in the array 'test2' 

是否有更好的方式刪除OBJ []列表中的對象,然後將其保存回數據庫?

編輯 輸出對象,它做的過濾器很好,但沒有刪除從requestsp[]

Request { user_added: '5910a77a0f03b33dbc482bfe', 
    name: 'Mark', 
    username: '_markie', 
    email: '[email protected]', 
    req_sent_by: 'Mark', 
    accepted: false } 

accept/deny obj { user_added: '5910a77a0f03b33dbc482bfe', 
    name: 'Mark', 
    username: '_markie', 
    email: '[email protected]', 
    req_sent_by: 'Mark', 
    accepted: true } 
+0

AcceptOrdeny對您正在通過indexOf查找的相同確切對象的引用嗎? – James

+0

是的,如果我只是console.log(acceptOrdeny)它給了我想要刪除的正確對象。 – MrNew

+0

我看到'user.request'被定義了,但是你指的是'user.requests'。這只是一個錯誤的例子嗎? – Caleb

回答

0

我相信發生的事情是indexOf找不到正確的項目,而是返回-1。

的indexOf使用等號操作,有可能是貓鼬檢索和快速體對象之間的衝突,造成這樣的事情:

var toFind = {'a': 1} 
var arr = [{'a': 1}, {'b':2}] 
var idx = arr.indexOf(toFind) 
//here, idx = -1, but you think idx = 0 

你需要實現自己的比較,並使用過濾器

user.requests = user.requests.filter(request => !(request.id.equals(acceptOrdeny.id))) 

同樣的事情,但更詳細:

user.requests = user.requests.filter(function(request){ 
    return !(request.id.equals(acceptOrdeny.id)) 
} 

根據數據格式,您可能需要在一個或兩個字符串上調用id.toString()。

而且,使用的是重複的邏輯,並且可以通過做簡化:

User.findOne({ _id: currUser._id }, function (err, user) { 
    if (err) throw err; 
    /* acceptOrdeny is the req.body object 
    checking if the key accepted==true then push acceptOrdeny object to friends[], splice from request[] then save to DB 
    */ 

    if (acceptOrdeny.accepted == true) { 
     user.friends.push(acceptOrdeny); 
    } 

    /* 
    checking if the key accepted==false remove from requests[], then save current array[] list 
    */ 
    user.requests = user.requests.filter(request => !(request.id.equals(acceptOrdeny.id))); 
    user.save(callback); 
}); 
+0

確實很奇怪,雖然'true'條件工作正常,它刪除數據庫中的正確對象。試過了你的,它沒有工作,甚至沒有拼接任何東西。 – MrNew

+0

@MrNew woops,我是使用拼接,但意味着切片編輯 –

+0

:)重複我想刪除的對象。 – MrNew

0

我不知道JavaScript的足夠好,告訴你爲什麼indexOf不工作。

您可以使用Mongo更新運算符($pull & $push)來實現相同。

if (acceptOrdeny.accepted == true) 
    User.updateOne({ _id: currUser._id }, {$pull : {"requests" : acceptOrdeny }, $push: { "friends": acceptOrdeny } }, function (err, data) { 
    if (err) throw err;); 
else 
    User.updateOne({ _id: currUser._id }, {$pull : {"requests" : acceptOrdeny }}, function (err, data) { 
    if (err) throw err;); 
+0

但是如何刪除在數據庫中「接受」或「拒絕」的對象? – MrNew

+0

'{$ pull:{「requests」:acceptOrdeny}'應該從數據庫中的'requests'中刪除對象&'{$ push:{「friends」:acceptOrdeny}'應該將對象添加到DB中的'friends'中更多https://docs.mongodb.com/manual/reference/operator/update/pull/&https://docs.mongodb.com/manual/reference/operator/update/push/ – Veeram

+0

似乎要推向'朋友'但不會從'requests'拉動對象 – MrNew