Mongoose:findOneAndUpdate不返回更新的文档

时间:2015-09-27 18:41:35

标签: node.js mongodb mongoose

以下是我的代码

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');

var Cat = mongoose.model('Cat', {
    name: String,
    age: {type: Number, default: 20},
    create: {type: Date, default: Date.now} 
});

Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}},function(err, doc){
    if(err){
        console.log("Something wrong when updating data!");
    }

    console.log(doc);
});

我的mongo数据库中已有一些记录,我想运行此代码来更新年龄为17的名称,然后在代码末尾打印出结果。

但是,为什么我仍然从控制台(而不是修改后的名称)获得相同的结果,但是当我转到mongo db命令行并输入“db.cats.find();”时。结果带有修改后的名称。

然后我再次运行此代码并修改结果。

我的问题是:如果数据被修改了,那么为什么我在第一次使用console.log时仍然可以获得原始数据。

11 个答案:

答案 0 :(得分:420)

默认是返回原始的,未经更改的文档。如果要返回新的更新文档,则必须传递一个附加参数:new属性设置为true的对象。

来自mongoose docs

  

<强>查询#findOneAndUpdate

Model.findOneAndUpdate(conditions, update, options, (error, doc) => {
  // error: any errors that occurred
  // doc: the document before updates are applied if `new: false`, or after updates if `new = true`
});
     

可用选项

     
      
  • new:bool - 如果 true ,则返回已修改文档,而不是原始文档。 默认为false (在4.0中更改)
  •   

因此,如果您想要更新doc变量中的结果:

Cat.findOneAndUpdate({age: 17}, {$set:{name:"Naomi"}}, {new: true}, (err, doc) => {
    if (err) {
        console.log("Something wrong when updating data!");
    }

    console.log(doc);
});

答案 1 :(得分:51)

对于使用Node.js驱动程序而非Mongoose的任何人,您都希望使用<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Provident hic impedit reprehenderit voluptates, voluptatibus ut explicabo, repudiandae, reiciendis soluta <span>facere in cum eveniet architecto sint.</span></p>而不是{returnOriginal:false}

答案 2 :(得分:37)

默认情况下findOneAndUpdate会返回原始文档。如果您希望它返回修改后的文档,则将选项对象{ new: true }传递给函数:

Cat.findOneAndUpdate({ age: 17 }, { $set: { name: "Naomi" } }, { new: true }, function(err, doc) {

});

答案 3 :(得分:34)

因此,“findOneAndUpdate”需要一个选项来返回原始文档。而且,选项是:

MongoDB shell

{returnNewDocument: true}

参考:https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/

猫鼬

{new: true}

参考:http://mongoosejs.com/docs/api.html#query_Query-findOneAndUpdate

Node.js MongoDB驱动程序API:

{returnOriginal: false}

参考:http://mongodb.github.io/node-mongodb-native/3.0/api/Collection.html#findOneAndUpdate

答案 4 :(得分:12)

对于那些使用本机承诺的ES6 / ES7风格偶然发现的人,这里有一个你可以采用的模式......

if(db.ZoekresultaatWerkvorms.Any(r => r.Werkvorm.Equals(parameter.Naam)))

答案 5 :(得分:9)

这是findOneAndUpdate的更新代码。它有效。

db.collection.findOneAndUpdate(    
  { age: 17 },      
  { $set: { name: "Naomi" } },      
  {
     returnNewDocument: true
  }    
)

答案 6 :(得分:2)

如果您想要退回更改的文档,则需要设置选项{new:true} API参考,您可以使用Cat.findOneAndUpdate(conditions, update, options, callback) // executes

官方Mongoose API http://mongoosejs.com/docs/api.html#findoneandupdate_findOneAndUpdate,您可以使用以下参数

A.findOneAndUpdate(conditions, update, options, callback) // executes
A.findOneAndUpdate(conditions, update, options)  // returns Query
A.findOneAndUpdate(conditions, update, callback) // executes
A.findOneAndUpdate(conditions, update)           // returns Query
A.findOneAndUpdate()                             // returns Query

官方API页面中没有表达的另一个实现,我更喜欢使用Promise基础实现,允许您.catch在那里处理所有各种错误

    let cat: catInterface = {
        name: "Naomi"
    };

    Cat.findOneAndUpdate({age:17}, cat,{new: true}).then((data) =>{
        if(data === null){
            throw new Error('Cat Not Found');
        }
        res.json({ message: 'Cat updated!' })
        console.log("New cat data", data);
    }).catch( (error) => {
        /*
            Deal with all your errors here with your preferred error handle middleware / method
         */
        res.status(500).json({ message: 'Some Error!' })
        console.log(error);
    });

答案 7 :(得分:2)

这里的猫鼬维护者。您需要将new选项设置为true(或将returnOriginal设置为false

await User.findOneAndUpdate(filter, update, { new: true });

// Equivalent
await User.findOneAndUpdate(filter, update, { returnOriginal: false });

请参见Mongoose findOneAndUpdate() docsthis tutorial on updating documents in Mongoose

答案 8 :(得分:1)

我知道,我已经迟到了,但是让我在这里添加我的简单且有效的答案

const query = {} //your query here
const update = {} //your update in json here
const option = {new: true} //will return updated document

const user = await User.findOneAndUpdate(query , update, option)

答案 9 :(得分:0)

下面显示了猫鼬findOneAndUpdate的查询。这里的new: true用于获取更新的文档,而fields则用于获取特定字段。

例如findOneAndUpdate(conditions, update, options, callback)

await User.findOneAndUpdate({
      "_id": data.id,
    }, { $set: { name: "Amar", designation: "Software Developer" } }, {
      new: true,
      fields: {
        'name': 1,
        'designation': 1
      }
    }).exec();

答案 10 :(得分:0)

在某些情况下,{new: true}无法正常工作。 然后您可以尝试一下。

{'returnNewDocument':true}