在MongoDB文档中更新字段,具体取决于另一个字段(在Node.js中使用Mongoose)

时间:2014-05-30 18:31:41

标签: javascript node.js mongodb mongoose updates

我在MongoDB数据库中有一个名为Article的集合,具有以下架构和模型:

var articleSchema = new Schema({
   site: String,
   date: String, 
   day: String, 
   link: {
    type: String,
    unique: true,
    index: {unique:true}    
 });

var Article = mongoose.model('Article', articleSchema);

文档示例,其中还没有day字段:

[ { site: 'www.atlantico.fr',
    date: '2014-05-27T11:10:19.000Z',
    link: 'http://www.atlantico.fr/example.html',
    _id: 538473817eb00f082f4803fc,
    __v: 0} ]

对于此集合的所有文档,我希望更新day字段,具体取决于date字段(以我知道的给定方式)。

我试过了:

Article.find() // all documents
.exec(function (err, articles) { // articles is an array

    for (var i=0; i<articles.length; i++) { // for each document

        var myDate = articles[i].date; // I take its date
        myDate = myDate.replace(/^(\d{4})\-(\d{2})\-(\d{2}).*$/, '$3/$2/$1'); // I create a new variable 

        Article.update({date: articles[i].date}, // articles with this date
                       {day : myDate }, // update with the new variable created using the date
                       function(err, numberAffected){  
        });                           
      }
});

如果我为给定文档运行此代码(通过在{link: 'http://www.atlantico.fr/example.html'}中添加Article.find()之类的条件,则可以正常运行。

但如果运行上面显示的代码,那应该是所有文档的工作,那一定有问题,因为那时我可以看到所有文档都没有更新。

我错过了什么?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

更新时,您无法参考文档中的字段。 您发布的答案似乎是要走的路。 请参阅此答案 Update MongoDB field using value of another field

答案 1 :(得分:0)

我看了http://mongoosejs.com/docs/2.7.x/docs/updating-documents.html,我尝试了这个:

Article.find({}, function (err, articles) {    
    for (var i=0; i<articles.length; i++) {            
        Article.findOne({ link: articles[i].link }, function (err, doc){
            doc.day = doc.date.replace(/^(\d{4})\-(\d{2})\-(\d{2}).*$/, '$3/$2/$1');
            doc.save();
        });      
     }  
});

似乎有效。

但我不知道这是否是最佳解决方案。