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'
}