【问题标题】:Issue in updating fields in an array of embedded documents Mongoose?更新嵌入文档数组中的字段时出现问题 Mongoose?
【发布时间】:2020-02-07 16:04:41
【问题描述】:

目前我的用户模型看起来像:

{
  _id: 'SomeId'
  firstName: 'John',
  lastName: 'Cena',
  book: [{_id:'xyz',title: 'a', author:'b', isbn:'10' },{_id:'abc',title: 'c', author:'d', isbn:'12' }]
}

在对 update isbn field of book object whose _id matches with req.params.id 进行 findOneAndUpdate 查询后:

router.post('/update_book/:id', (req, res) => { 
  User.findOneAndUpdate({'book._id':req.params.id},{book: {isbn: '15'} }, {new: true,'book.$': 
  1}).select('book').exec((err,doc)=>{
  console.log(doc);
  }
});

在上面的代码之后,我的集合看起来像:

{
  _id: 'SomeId'
  firstName: 'John',
  lastName: 'Cena',
  book: [{isbn:'15' }]
} 

它实际上删除了所有其他书籍对象,并删除了匹配书籍对象的其他字段。请帮我正确写findOneAndUpdate查询!

【问题讨论】:

    标签: mongodb mongoose mongodb-query mongoose-schema


    【解决方案1】:

    您需要使用位置$ operator 仅更新与查询匹配的元素。

    例子:

    User.findOneAndUpdate({'book._id':req.params.id}, {'book.$.isbn': '15'}...
    

    【讨论】:

    • 我面临着这个问题的另一个问题...findOneAndUpdate 正确更新了该书,但将每本书对象作为输出,尽管我添加了'book.$': 1 和new:true作为选项...
    • 您需要使用fields 选项。但是您不能使用位置投影并返回新文档,因此您需要使用$elemMatch。比如:{fields: {book: {$elemMatch: {_id: req.params.id}}}, new: true}
    • 在多次执行此查询后,位置投影现在给出了意想不到的结果......它实际上是多次推送同一本书对象{'book.$.isbn': '15'}
    • 什么意思?你能提供更多细节吗?
    • 兄弟...帮我解答这个问题:stackoverflow.com/questions/58375310/…
    猜你喜欢
    • 2020-02-07
    • 1970-01-01
    • 2014-06-12
    • 2023-03-10
    • 1970-01-01
    • 2020-06-07
    • 2016-10-06
    • 2011-12-21
    • 2017-07-05
    相关资源
    最近更新 更多