Node.js 如何使用MongoDB/Mongoose中的先前值更新字段
例如,我有一些文档如下所示:Node.js 如何使用MongoDB/Mongoose中的先前值更新字段,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,例如,我有一些文档如下所示: { id: 1 name: "foo" } db.test.find({ name: "bar" }).snapshot().forEach((doc) => { doc.name = "foo-" + doc.name; db.test.save(doc); }); 我想将另一个字符串附加到当前的名称字段值 我使用Mongoose尝试了以下方法,但无效: Model.findOneAndUpdate({ id: 1 },
{
id: 1
name: "foo"
}
db.test.find({ name: "bar" }).snapshot().forEach((doc) => {
doc.name = "foo-" + doc.name;
db.test.save(doc);
});
我想将另一个字符串
附加到当前的名称
字段值
我使用Mongoose尝试了以下方法,但无效:
Model.findOneAndUpdate({ id: 1 }, { $set: { name: +"bar" } }, ...);
您不能引用要更新的文档的值,因此需要一个查询来检索文档,另一个查询来更新文档。自2016年以来,在
OPEN
州似乎有了一个新的解决方案
如果您有一个包含如下文档的集合:
{ "_id" : ObjectId("590a4aa8ff1809c94801ecd0"), "name" : "bar" }
{ "_id" : ObjectId("XXX"), "name": "foo-bar" }
使用MongoDB shell,您可以执行以下操作:
{
id: 1
name: "foo"
}
db.test.find({ name: "bar" }).snapshot().forEach((doc) => {
doc.name = "foo-" + doc.name;
db.test.save(doc);
});
该文件将按预期更新:
{ "_id" : ObjectId("590a4aa8ff1809c94801ecd0"), "name": "foo-bar" }
记下电话。
这可以确保查询不会多次返回文档,因为中间的写入操作会由于文档大小的增长而移动文档
将此应用于猫鼬示例,如中所述:
值得一提的是,聚合框架中有一个操作符,但不幸的是,您不能在更新
查询中使用它
无论如何,根据需要执行的操作,您可以将其与运算符一起使用,将聚合结果保存到新集合中
使用相同的示例,您将执行以下操作:
db.test.aggregate([{
$match: { name: "bar" }
}, {
$project: { name: { $concat: ["foo", "-", "$name"] }}
}, {
$out: "prefixedTest"
}]);
将创建一个新的集合prefixedTest
,其中包含如下文档:
{ "_id" : ObjectId("590a4aa8ff1809c94801ecd0"), "name" : "bar" }
{ "_id" : ObjectId("XXX"), "name": "foo-bar" }
作为参考,关于同一主题还有另一个有趣的问题和一些值得阅读的答案:如果这仍然相关,我有一个MongoDB 4.2的解决方案 我的
“项目”
文档的“项目截止日期”
字段是数组类型([“2020”、“12”、“1”]
)时也遇到了同样的问题
使用Robo3T,我使用SRV链接连接到我的MongoDB Atlas数据库。然后执行下面的代码,它为我工作
初始文件:
{
_id : 'kjnolqnw.KANSasdasd',
someKey : 'someValue',
projectDeadline : ['2020','12','1']
}
{
_id : 'kjnolqnw.KANSasdasd',
someKey : 'someValue',
projectDeadline : '2020-12-01 21:00:00.000Z'
}
CLI命令:
db
.getCollection('mainData')
.find({projectDeadline: {$not: {$eq: "noDeadline"}}})
.forEach((doc) => {
var deadline = doc.projectDeadline;
var deadlineDate = new Date(deadline);
db
.mainData
.updateOne({
_id: doc._id},
{"$set":
{"projectDeadline": deadlineDate}
}
)}
);
结果文件:
{
_id : 'kjnolqnw.KANSasdasd',
someKey : 'someValue',
projectDeadline : ['2020','12','1']
}
{
_id : 'kjnolqnw.KANSasdasd',
someKey : 'someValue',
projectDeadline : '2020-12-01 21:00:00.000Z'
}