【问题标题】:Skip duplicates before saving to firebase cloud firestore with node js在使用节点 js 保存到 Firebase Cloud Firestore 之前跳过重复项
【发布时间】:2020-06-16 19:54:27
【问题描述】:

我的项目是一个新闻提要应用程序。我可以成功地将从 API 获取的数据保存到 firebase。但是,我的数据库中保存了重复的新闻数据。

我该如何防止这种情况发生。 请参阅下面的代码:

// fetch news api
getData = (req, res) => {
return request(newsURL)
.then(news => (news.articles))
.then(infos => {infos.map((info) => {
    const newsDoc = {
        author: info.author,
        content: info.content,
        description: info.description,
        publishedAt: info.publishedAt,
        source: info.source.name,
        title: info.title,
        url: info.url,
        urlToImage: info.urlToImage,
        likeCount: 0,
        commentCount: 0
    }
    db.collection("feeds").add(newsDoc)
        .then((doc) => {
    const finalNews = newsDoc;
    finalNews.feedsId = doc.id;
    // res.json(finalNews)
})
.catch(err => console.error(err))
})})
};

我认为所有新闻数据的唯一标识符是 URL。

这篇文章中的问题 - Skip Duplicates in Firebase Database 与我的有关,但我似乎可以让它工作

请问如何保存唯一的新闻数据而不重复

查看来自 firebase 数据库的数据示例:

// original
{
    "feedsId": "Cjy5lW6g6StTVj1GjpQk",
    "author": "El Confidencial",
    "content": "Germán Loera, un conocido 'youtuber' en Mçexico de 25 años, ha sido condenado a 50 años de prisión por un delito de secuestro cometido en Chihuaha en 2018. Los secuestrados reclamaron la cantidad de dinero del rescate en bitcoin. Según ha informado la Fiscalí… [+1153 chars]",
    "description": "Germán Loera, de 25 años, ha sido condenado a 50 años de prisión junto a otros cinco hombres por secuestrar en 2018 a una abogada",
    "publishedAt": "2020-03-04T17:45:00Z",
    "title": "A prisión un 'youtuber' mexicano por un secuestro y pedir el rescate en bitcoins",
    "url": "https://www.elconfidencial.com/amp/mundo/2020-03-04/prision-youtube-mexico-secuestro-bitcoin_2482519/",
    "urlToImage": "https://www.ecestaticos.com/imagestatic/clipping/5c9/56e/5c956e35512404b3022b56dbe0b80c3b/a-prision-un-youtuber-mexicano-por-un-secuestro-y-pedir-el-rescate-en-bitcoins.jpg?mtime=1583343920",
    "likeCount": 0,
    "commentCount": 0
},

// duplicate
{
    "feedsId": "MqqFnixBwQmA0CoBzwr2",
    "author": "El Confidencial",
    "content": "Germán Loera, un conocido 'youtuber' en Mçexico de 25 años, ha sido condenado a 50 años de prisión por un delito de secuestro cometido en Chihuaha en 2018. Los secuestrados reclamaron la cantidad de dinero del rescate en bitcoin. Según ha informado la Fiscalí… [+1153 chars]",
    "description": "Germán Loera, de 25 años, ha sido condenado a 50 años de prisión junto a otros cinco hombres por secuestrar en 2018 a una abogada",
    "publishedAt": "2020-03-04T17:45:00Z",
    "title": "A prisión un 'youtuber' mexicano por un secuestro y pedir el rescate en bitcoins",
    "url": "https://www.elconfidencial.com/amp/mundo/2020-03-04/prision-youtube-mexico-secuestro-bitcoin_2482519/",
    "urlToImage": "https://www.ecestaticos.com/imagestatic/clipping/5c9/56e/5c956e35512404b3022b56dbe0b80c3b/a-prision-un-youtuber-mexicano-por-un-secuestro-y-pedir-el-rescate-en-bitcoins.jpg?mtime=1583343920",
    "likeCount": 0,
    "commentCount": 0
},

【问题讨论】:

    标签: node.js firebase firebase-realtime-database google-cloud-firestore google-cloud-functions


    【解决方案1】:

    URL 确实是您可以使用的唯一标识符。

    在您只是添加的代码中,尝试添加对 url 的检查,如下例所示:

    let citiesRef = db.collection('feeds');
    let query = citiesRef.where('url', '==', newsDoc.url).get()
        .then(snapshot => {
            if (snapshot.empty) {
                console.log('No matching documents.');
                db.collection("feeds").add(newsDoc).then((doc) => {
                        const finalNews = newsDoc;
                        finalNews.feedsId = doc.id;
                    })
                    .catch(err => console.error(err))
            }
        })
        .catch(err => {
            console.log('Error getting documents', err);
        });
    

    【讨论】:

    • 嗨,它不起作用,它仍在保存重复项
    • 这些新副本的 URL 是否唯一?你能分享一个样本吗?
    • 我已经添加了来自 db 的响应
    • 您使用的是 node.js,对吗?将doc.exists 更改为doc.empty,我将更新答案中的代码,以便您可以复制它
    • 不工作.. 查看错误信息:TypeError: db.collection(...).update is not a function
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2020-07-05
    • 2019-02-02
    • 1970-01-01
    • 2020-06-07
    • 2022-07-08
    相关资源
    最近更新 更多