Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在for循环中升级子文档_Node.js_Mongodb_Mongoose_Upsert - Fatal编程技术网

Node.js 在for循环中升级子文档

Node.js 在for循环中升级子文档,node.js,mongodb,mongoose,upsert,Node.js,Mongodb,Mongoose,Upsert,我不确定这为什么不起作用,我尝试了几种不同的语法变体,但没有成功。我也不确定在for循环中进行更新是否是个好主意 基本上,我通过传递一个包含两个数组(item[]和item_qty[])的对象来更新用户的库存,这两个数组类似于: var itemset = {} itemset.item['Gold','Silver','Bronze'] itemset.item_qty[1,3,5] itemset.qty = itemset.item.length var itemset = {} ite

我不确定这为什么不起作用,我尝试了几种不同的语法变体,但没有成功。我也不确定在for循环中进行更新是否是个好主意

基本上,我通过传递一个包含两个数组(item[]和item_qty[])的对象来更新用户的库存,这两个数组类似于:

var itemset = {}
itemset.item['Gold','Silver','Bronze']
itemset.item_qty[1,3,5]
itemset.qty = itemset.item.length
var itemset = {}
itemset.item['Platinum','Bronze']
itemset.item_qty[1,1]
itemset.qty = itemset.item.length
阵列可以具有不同的长度,例如:

var itemset = {}
itemset.item['Gold','Silver','Bronze']
itemset.item_qty[1,3,5]
itemset.qty = itemset.item.length
var itemset = {}
itemset.item['Platinum','Bronze']
itemset.item_qty[1,1]
itemset.qty = itemset.item.length
目标是如果项目存在,则继续添加到用户的库存项目数量,如果项目不存在,则添加(连同数量)。因此,使用这两个更新的示例,用户在通过该函数后将拥有白金(1)、黄金(1)、白银(3)和青铜(6)

用户的架构为:

var UserSchema = new mongoose.Schema({
    name: {type: String, required: true},
    mail: {type: String, required: true},
    inv: {
        item: {type: String},
        iqty: {type: Number}
    }
})
下面是函数:

function addInv(userId,itemset) {
    for(i=0;i<itemset.qty;i++){
        console.log('Updating:' + itemset.item[i])
        db.User.update(
        //Criteria
        {
            _id: userId,
            inv: {item: itemset.item[i]}
        },
        {   
            $set: 
            {            
                inv: 
                {
                    '$item': itemset.item[i],
                    $inc: {'$iqty': itemset.item_count[i]}
                }
            }
        }, 
        {upsert:true},
        function(err,i) 
        {
            console.log('Error: ' + err)
            console.log('Db: ' + i)
        }) //End Update()
    }
}
函数addInv(userId,itemset){

对于(i=0;i首先,我认为在$之后缺少“.”-如果使用位置运算符进行更新,则需要$.subitem语法。其次,您可能混淆了upserts(如果不存在用于更新的顶级文档,则需要插入该文档)和$addToSet(即$push to数组中的一个新项(子文档))如果它还不存在。前者可能与缺少更新有关,但后者表明这不是您想要实现的正确结构。对于回复,我在更改语法时遇到的错误确实表明它试图创建重复的“用户”但我只是不知道如何处理这个问题。另外,我不能使用$push或$addToSet,因为“inv”不是数组,而是(子)文档类型。你能在MongoDB中包含一个文档,在更新之前或之后显示一个典型记录吗?对于每个用户,如果不是通过数组,你如何表示他们是否有多个项目?