2017-05-03 142 views
0

例如使用先前的值更新場,我有一些文件看起來像這樣:如何在MongoDB中/貓鼬

{ 
    id: 1 
    name: "foo" 
} 

我要追加另一個string到當前name字段值。

我嘗試以下使用貓鼬,但沒有奏效:

Model.findOneAndUpdate({ id: 1 }, { $set: { name: +"bar" } }, ...); 

回答

1

你不能指的是你要更新的文檔的值,所以你需要一個查詢檢索文件和另一個更新它。它看起來像有在OPEN國家對一個feature request自2016年

如果你有看起來像文檔的集合:

{ "_id" : ObjectId("590a4aa8ff1809c94801ecd0"), "name" : "bar" } 

使用MongoDB的外殼,你可以做這樣的事情:

db.test.find({ name: "bar" }).snapshot().forEach((doc) => { 
    doc.name = "foo-" + doc.name; 

    db.test.save(doc); 
}); 

預期該文件將被更新:

{ "_id" : ObjectId("590a4aa8ff1809c94801ecd0"), "name": "foo-bar" } 

請注意撥打.snapshot()。 這確保查詢不會多次返回文檔,因爲由於文檔大小的增長,介入寫入操作會移動它。

應用給你的貓鼬例如,如this official example解釋說:

Cat.findById(1, (err, cat) => { 
    if (err) return handleError(err); 

    cat.name = cat.name + "bar"; 

    cat.save((err, updatedCat) => { 
     if (err) return handleError(err); 

     ... 
    }); 
}); 

值得一提的是,有一個在聚合框架$concat運營商,但不幸的是你不能使用,在一個update查詢。

無論如何,取決於您需要做什麼,您可以使用它們與$out運算符一起將彙總結果保存到新集合中。

用同樣的例子,你會做什麼:

db.test.aggregate([{ 
    $match: { name: "bar" } 
}, { 
    $project: { name: { $concat: ["foo", "-", "$name"] }} 
}, { 
    $out: "prefixedTest" 
}]); 

和一個新的集合prefixedTest將看起來像文件被創建:

{ "_id" : ObjectId("XXX"), "name": "foo-bar" } 

只是作爲參考,還有另一個有趣的問題關於這個相同的話題有幾個答案值得閱讀:Update MongoDB field using value of another field