2016-06-08 123 views
2

我想做如下: -更新陣列值與嵌件

  1. 找到用戶id是否存在其他創建一個
  2. 發現帳戶及推項目到數組,如果該項目已經存在不推

模式

var ItemSchema = mongoose.Schema({ 
    "userId" : { 
     type:String 
    }, 
    "item" : [] 
}); 

我可以這樣做,findOne然後獲取數組,然後找到數組是否存在,否則push然後保存它。

只是好奇是否有任何內置mongoose這樣做?

+0

什麼元素的'item'數組中的類型? – styvane

+1

你可以試試'$ set'來做'update','upsert爲true'來實現第一個。你可以試試'$ addtoset'來實現第二個。 – Shrabanee

回答

0

解決問題的方法:

ItemSchema.findOne({"userId":"yourId"},function(err,data){ 
    if(data.length > 0){ 
    console.log("USER EXISTS"); 
    var newItemPush="newItem"; 
    //For Task 2 
    //Add Item if Item Does not Exits 
    ItemSchema.find({"userId":"yourId"},{ item: { $elemMatch: { item: newItemPush } } },function(err,data){ 
     if(data.length > 0){ 
      console.log("ADDING NEW ITEM"); 
      ItemSchema.findOneAndUpdate({"userId":"yourId"},{ item: { $elemMatch: { item: newItemPush } } },function(err,data){ 
       if(data){ 
        console.log("NEW ITEM PUSHED SUCCESSFULLY"); 
       } 

      }); 
     } 
    }); 
    } 
    else { 
    //Task 1 
    console.log("USER DOES NOT EXISTS NOW CREATE ONE"); 
    var insertData={ 
     userId:"newUserId", 
     {$push: { item: "your item" } } 

    } 
    ItemSchema.update({},insertData,function(err,data){ 
     if(data){ 
      console.log("DATA INSERTED") 
     } 
     else{ 
      console.log("DATA NOT INSERTED:"+err); 
     } 
    }) 
    } 

}); 
+0

它使用雙重查找,不是更好嗎?爲什麼不使用一個find,獲取所有的數組並使用原生javascript函數使數組唯一,然後推送它? –

+0

即使你這樣做,它會採取2個查詢,所以它的一個和相同的,一個獲得所有的數組和其他推動獨特的陣列!!!!! –

+0

你的是3,2查找和1更新。 –