mongodb Mongoose Model.update在我的代码中不起作用

k97glaaz  于 2023-11-17  发布在  Go
关注(0)|答案(6)|浏览(159)

我想用给定的id更新一些课程属性。这是我的代码:

const mongoose = require('mongoose');
const courseSchema = new mongoose.Schema({
    name: String,
    author: String,
    tags: [String],
    date: Date,
    isPublished: Boolean,
    price: Number
});

const Course = mongoose.model('Course', courseSchema);
mongoose.connect('mongodb://localhost/mongo-exercises');

async function updateCourse(id) {
     const result = await Course.update({_id: id}, {
        $set: {
            author: 'New', 
            isPublished: false
        }
    });

console.log(result);
}

updateCourse('5a68fde3f09ad7646ddec17e');

字符串
在控制台上,我得到{ok: 1, nModified: 0, n: 0}
我试过用另一种方式更新元素,但它不起作用。对于这段代码,我没有得到结果,没有响应:

const course = await Course.findById(id);
  if(!course) return; 

  course.isPublished = true; 
  course.author = 'Another Author';

  const result = await course.save();
  console.log(result);


当我尝试使用findByIdAndUpdate更新其他代码时,结果在控制台中为null:

async function updateCourse(id) {
    const course = await Course.findByIdAndUpdate(id, {
    $set: {
        author: 'Billy',
        isPublished: false
    }
 });

   console.log(course);

 }
updateCourse('5a68fde3f09ad7646ddec17e');


我使用的数据库有:

{ _id: 5a68fdd7bee8ea64649c2777,
   name: 'Node.js Course',
   author: 'Sam',
   isPublished: true,
   price: 20 },
 { _id: 5a68fde3f09ad7646ddec17e,
   name: 'ASP.NET MVC Course',
   author: 'Mosh',
   isPublished: true,
   price: 15 },
 { _id: 5a6900fff467be65019a9001,
   name: 'Angular Course',
   author: 'Mosh',
   isPublished: true,
   price: 15 },
 { _id: 5a68fe2142ae6a6482c4c9cb,
   name: 'Node.js Course by Jack',
   author: 'Jack',
   isPublished: true,
   price: 12 }


课程没有更新。错误在哪里?请注意,如果我想创建新文档,它没有问题。

9vw9lbht

9vw9lbht1#

update({_id: id},...)指定_id,在文档中期望_id类型为ObjectID
update()findById()不会找到_id,并返回null,因为_id类型可能是您的集合/文档中的String,请使用Compass检查。

u2nhd7ah

u2nhd7ah2#

根据MongoDB update doc,我在代码中没有看到任何问题,这里的查询和语法是正确的。
update()方法返回包含操作状态的WriteResult对象。成功后,WriteResult对象包含与查询条件匹配的文档数、更新插入的文档数以及修改的文档数。
这里没有文档被修改,唯一的原因是您在查询中设置了相同的数据要更新。

4uqofj5v

4uqofj5v3#

尝试使用

isPublished: {
    type: Boolean,
    default: false
}

字符串
而不是

isPublished: Boolean

ve7v8dk2

ve7v8dk24#

返回值{ok: 1, nModified: 0, n: 0}表示操作成功,但无法找到或更新任何条目,因此这意味着它甚至不匹配。
我不完全确定,但我认为mongoose只通过ObjectId找到ID,而不是string
所以你应该通过转换它来得到想要的结果,就像这样:

const result = await Course.update({ _id: mongoose.Types.ObjectId(id) }, { 
    $set: { author: 'New', isPublished: false }
});

字符串

7cwmlq89

7cwmlq895#

在您的架构中添加_id:String

const courseSchema=new mongoose.Schema({
  name:String,
  _id:String,
  author:String,
  tags: [String],
  date: Date,
  isPublished: Boolean,
  price: Number
});

字符串
把你的承诺换成这个:

async function updateCourse(id) {
  const result = await Course.update({ _id: mongoose.Types.ObjectId(id) }, { 
    $set: { author: 'New Author', isPublished: false }
  });


我在mosh node.js课程中遇到了同样的问题,这个解决方案对我很有效!:)

rjzwgtxy

rjzwgtxy6#

我在.update() 中遇到了同样的问题,我将其更改为.updateOne(),它工作得很好

相关问题