【问题标题】:update array value in mongod with insert使用插入更新MongoDB中的数组值
【发布时间】:2016-10-08 11:55:06
【问题描述】:

我想做以下事情:-

  1. 如果存在则查找 userId,否则创建一个
  2. 找到 userId 并将 item 推送到数组中,如果 item 已经存在则不要推送

架构

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

我可以,findOne 然后获取数组,然后查找数组是否存在,否则推送然后保存。

只是好奇有没有内置的mongoose 这样做?

【问题讨论】:

  • item数组中的元素是什么类型的?
  • 你可以尝试$setupdateupsert as true来实现第一个。你可以试试$addtoset实现第二个。

标签: arrays node.js mongodb


【解决方案1】:

您的问题的解决方案:

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);
        }
    }) 
   }

});

【讨论】:

  • 它使用了双重查找,不是更好吗?为什么不使用一次查找,获取所有数组并使用原生javascript函数使数组唯一,然后推送它?
  • 即使你这样做,它也需要 2 次查询,所以它的一个相同,一个获取所有数组,另一个推送唯一的数组!!!!!!
猜你喜欢
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
  • 2018-03-10
  • 2020-09-14
相关资源
最近更新 更多