有没有办法用猫鼬更新具有不同值的多个文档?

时间:2019-12-19 01:22:50

标签: javascript mongodb mongoose

我感觉可能没有办法做到这一点,但是这是我要完成的工作,我有很多产品要更新,如下所示:

const productsToUpdate = [
    {
        "imgUrls": {
            "base": [
                "https://files.cdn.printful.com/files/ba1/ba13faa1332b7f18ec847cb9f4d79868_preview.png"
            ],
            "side": [
                "https://files.cdn.printful.com/files/ba1/ba13faa1332b7f18ec847cb9f4d79868_preview.png"
            ]
        },
        "_id": "5dd6173cf50c1d1a40fe7c2c",
        "category": "MENS",
        "name": "JavaScript is Cool",
        "price": "27.50" 
    },
        {
        "imgUrls": {
            "base": [
                "https://files.cdn.printful.com/files/ba1/ba13faa1332b7f18ec847cb9f4d79868_preview.png"
            ],
            "side": [
                "https://files.cdn.printful.com/files/ba1/ba13faa1332b7f18ec847cb9f4d79868_preview.png"
            ]
        },
        "_id": "5dd6173cf50c1d1a40fe7c2c",
        "category": "MENS",
        "name": "Testing",
        "price": "25.50" 


    }
]

此数据结构与当前存储在我的数据库中的产品的数据匹配。基本上,我需要通过_id查找当前产品,并且能够更新类别,价格,imgUrls或名称或以上所有名称。

我已经做过一些研究,并且知道我可以从toUpdate arr中获取所有ID,然后进行类似

的操作
Collection.update({ _id: { $in: arrOfIds }, {}, {multi: true}))

但是我不确定如何填写查询以获取正确的类别/价格/名称等。

非常感谢您提供任何指导,如果您需要更多信息,请告诉我!

1 个答案:

答案 0 :(得分:0)

这种“大量更新”或最有效的更新方式称为bulkWrite。由于数据库中还有更多字段,并且您不想丢失它们,因此需要使用$set运算符。

const productsToUpdate = [
    {
        "imgUrls": {
            "base": [
                "https://files.cdn.printful.com/files/ba1/ba13faa1332b7f18ec847cb9f4d79868_preview.png"
            ],
            "side": [
                "https://files.cdn.printful.com/files/ba1/ba13faa1332b7f18ec847cb9f4d79868_preview.png"
            ]
        },
        "_id": "5dd6173cf50c1d1a40fe7c2c",
        "category": "MENS",
        "name": "JavaScript is Cool",
        "price": "27.50" 
    },
        {
        "imgUrls": {
            "base": [
                "https://files.cdn.printful.com/files/ba1/ba13faa1332b7f18ec847cb9f4d79868_preview.png"
            ],
            "side": [
                "https://files.cdn.printful.com/files/ba1/ba13faa1332b7f18ec847cb9f4d79868_preview.png"
            ]
        },
        "_id": "5dd6173cf50c1d1a40fe7c2c",
        "category": "MENS",
        "name": "Testing",
        "price": "25.50" 


    }
];

let toUupdate = product => ({
    updateOne: { 
        "filter": { "_id": product._id }, 
        "update": { "$set": { category: product.category, name: product.name, price: product.price }  }   
    }
})

db.collection.bulkWrite(productsToUpdate.map(toUupdate);

console.log(updates);