例如使用先前的值更新場,我有一些文件看起來像這樣:如何在MongoDB中/貓鼬
{
id: 1
name: "foo"
}
我要追加另一個string
到當前name
字段值。
我嘗試以下使用貓鼬,但沒有奏效:
Model.findOneAndUpdate({ id: 1 }, { $set: { name: +"bar" } }, ...);
例如使用先前的值更新場,我有一些文件看起來像這樣:如何在MongoDB中/貓鼬
{
id: 1
name: "foo"
}
我要追加另一個string
到當前name
字段值。
我嘗試以下使用貓鼬,但沒有奏效:
Model.findOneAndUpdate({ id: 1 }, { $set: { name: +"bar" } }, ...);
你不能指的是你要更新的文檔的值,所以你需要一個查詢檢索文件和另一個更新它。它看起來像有在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