MongoDB-使用$ addToSet根据ID匹配将值添加到数组

问题描述

我正在使用MongoDB Realm构建应用程序。该应用程序将有关用户运动卡的信息(每个运动卡具有该用户唯一的cardId)存储在一个集合中,然后进入并获取与每个运动卡相关的完整eBay列表(使用标题,玩家名称等)。来自记录),并将这些数据保存到单独的Mongo集合以及cardId中。

此过程有效(尽管可能是我的劣质代码!),Mongo中的文档如下所示:

{
"_id": {
"$oid": "5f6a5bda82c81067eac32da6"
},"itemId": "174428279769","cardId": [
"Was-Ant-5281"
],"galleryURL": "https://thumbs2.ebaystatic.com/m/m1heSnR2qz5NbPw7mCxQhkg/140.jpg","title": "2020 Black Silver Ink 3-Color Rookie Patch Auto #229 Antonio Gibson #54//99"
}

因为另一个用户生成一个返回相同ebay itemId的ebay API请求是可行的,所以在我的代码中,我试图检查是否存在具有相同itemId的记录,以及是否存在将cardId添加到数组中,而不是生成新文档。

我在SO上读过一些类似的问题,这些问题建议我可以将$addToSet$set一起使用,但是当我尝试这样做时,会出现诸如uncaught promise rejection: multiple write errors: [{write errors: [{Updating the path 'cardId' would create a conflict at 'cardId'}]},{<nil>}]之类的错误

完整代码如下-有人可以建议这样做的正确方法吗?

exports = async function(payload) {
const axios = require("axios");
const mongodb = context.services.get("mongodb-atlas");
const eventsdb = mongodb.db("cards");
const eventscoll = eventsdb.collection("ebay-prices");

//////////// Get a list of a users cards from the cards collection

var collection = context.services.get("mongodb-atlas").db("cards").collection("stuart collection");
var ownedCards = await collection.find({
    forTrade: "Yes"
}).toArray();
for (let card of ownedCards) {
// make the ebay API call based on card brand,card series and player name
    let url = "http://svcs.ebay.com/services/search/FindingService/v1?GLOBAL-ID=EBAY-US&REST-PAYLOAD&keywords=" + card.brand + " " + card.series + " " + card.player +
        "&itemFilter(0).name=SoldItemsOnly&itemFilter(0).value=true&OPERATION-NAME=findCompletedItems&paginationInput.entriesPerPage=6&paginationInput.pageNumber=1&RESPONSE-DATA-FORMAT=json&Security-APPNAME=<MyAPPID>&SERVICE-NAME=FindingService&SERVICE-VERSION=1.12.0";
 
    let cardId = card.card_id;

    axios
        .get(url)
        .then(resp => {
            for (const item in resp.data.findCompletedItemsResponse[0].searchResult[0].item) {
                const itemId = resp.data.findCompletedItemsResponse[0].searchResult[0].item[item].itemId[0];
                const title = resp.data.findCompletedItemsResponse[0].searchResult[0].item[item].title[0];
                const galleryURL = resp.data.findCompletedItemsResponse[0].searchResult[0].item[item].galleryURL[0];

                const result = eventscoll.updateOne({
                    itemId: itemId
                },{
                    // $addToSet: { cardId: { $each: cardId } },$set: {
                        itemId: itemId,title: title,cardId: [cardId],galleryURL: galleryURL
                    }
                },{
                    upsert: true
                })
            }


        })
}

};

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)