您好我有如下收藏
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});
问题是这段代码没有插入新文章
答案 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/