插入多个记录和/或更新特定字段并仅返回插入的新记录(MongoDB)

时间:2014-02-07 02:50:15

标签: node.js mongodb node-mongodb-native

您好我有如下收藏

var articles = [
                {
                  "title": "Article title1",
                  "content": "Article ... content......... 1. ",
                  "url": "http://matt.wordpress.com/article/X",
                  "last_fetched_time": new Date();
                },
                {
                  "title": "Article title2",
                  "content": "Article ... content......... 2. ",
                  "url": "http://matt.blogger.com/article/Y",
                  "last_fetched_time": new Date();
                }
            ];
db.collection('articles').insert(articles, {safe:true}, function(err, result) {}); //articles collection created

我想定期从多个端点并行获取博客供稿,并将新文章添加到集合中,并更新集合中现有文章的上次提取日期时间字段。如果我没有要求太多,我也希望upsert的回调只返回插入的新文章。

//fetch articles periodically
fetchArticles = function(req, res) {
async.parallel([
    //fetch word press endpoint
        //get "title", "content", "url"
        //set last_fetched_time with new Date();

    //fetch blogger endpoint
        //get "title", "content", "url"
        //set last_fetched_time with new Date();
], 
function(err, results) {
    //merge results[0] and results[1] in a batch =[]
    //if the article url is not already in the collection, insert article into the articles collection
    //if the article url is found in the collection, update article because last_fetched_time changed 
    //finally return only new inserted articles, not updated ones
    db.collection('articles').update(batch, {safe:true, upsert : true}, function(err, result) { 

        //result = only new articles inserted
    });
});

}

url字段应该是唯一的,我做了

db.articles.ensureIndex({"url":1}, {unique: true, sparse:true, dropDups: true});

问题是这段代码没有插入新文章

1 个答案:

答案 0 :(得分:0)

即使我清楚地看到你想要做什么,你似乎也混淆了你的功能。

您传入的batch包含要插入/更新的数组文档。问题是此功能仅适用于insert方法。

由于您使用的是update方法,因此无法传递用于批处理的文档数组。设置为 upsert 的更新旨在使用selector和单个“文档”的主要参数发布。我们的想法是selector匹配现有文档,该文档将使用document中的详细信息进行更新。如果未找到匹配项,则会插入新文档。

此外,由于您尚未使用,因此可以应用选项。它的目的是当selector匹配多个文档时,更改将应用​​于所有匹配的文档。未指定该行为被视为错误,只会更新找到的第一个匹配文档。

看起来虽然你希望这有一个批处理功能,但目前还不存在。您可以关注/支持JIRA。

https://jira.mongodb.org/browse/SERVER-2172

请参阅文档中功能的链接,其中说明了所有可用的参数和选项。另请参阅shell文档以获取有关选项的详细说明:

http://docs.mongodb.org/manual/reference/method/db.collection.update/