我想做如下: -更新陣列值與嵌件
- 找到用戶id是否存在其他創建一個
- 發現帳戶及推項目到數組,如果該項目已經存在不推
模式
var ItemSchema = mongoose.Schema({
"userId" : {
type:String
},
"item" : []
});
我可以這樣做,findOne
然後獲取數組,然後找到數組是否存在,否則push然後保存它。
只是好奇是否有任何內置mongoose
這樣做?
我想做如下: -更新陣列值與嵌件
模式
var ItemSchema = mongoose.Schema({
"userId" : {
type:String
},
"item" : []
});
我可以這樣做,findOne
然後獲取數組,然後找到數組是否存在,否則push然後保存它。
只是好奇是否有任何內置mongoose
這樣做?
解決問題的方法:
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);
}
})
}
});
它使用雙重查找,不是更好嗎?爲什麼不使用一個find,獲取所有的數組並使用原生javascript函數使數組唯一,然後推送它? –
即使你這樣做,它會採取2個查詢,所以它的一個和相同的,一個獲得所有的數組和其他推動獨特的陣列!!!!! –
你的是3,2查找和1更新。 –
什麼元素的'item'數組中的類型? – styvane
你可以試試'$ set'來做'update','upsert爲true'來實現第一個。你可以試試'$ addtoset'來實現第二個。 – Shrabanee