Mongoose:findOneAndUpdate 不适用于多种条件

Posted

技术标签:

【中文标题】Mongoose:findOneAndUpdate 不适用于多种条件【英文标题】:Mongoose: findOneAndUpdate not working for multiple conditions 【发布时间】:2021-09-29 15:38:46 【问题描述】:

如果员工id的姓名和喜好不在数组中,则需要添加新记录,否则需要添加新记录。

例如


  name: 'AA',
  likes: [eid:100,eid:101]
,

  name:'BB',
  likes:[eid:100,eid:102]

从 API 调用我传递以下值

条件一


name:'AA', eid: '101' => 这里name "AA" 和eid 101 的值都存在于记录中,所以我不想添加新记录

条件2


name:'AA', eid: '105' => 这里需要添加同名的新记录,所以输出如下所示

    
      name: 'AA',
      likes: [eid:100,eid:101,eid:105]
    ,

条件 3


name:'CC', eid: '101' => 然后应该添加新记录,所以最终输出是

    
      name: 'AA',
      likes: [eid:100,eid:101, eid:105]
    ,
    
      name:'BB',
      likes:[eid:100,eid:102]
    ,
    
      name:'CC',
      likes:[eid:101]
    

我的代码如下

postData(data) 

const newLikeDbDto: LikesDbDto = 
    eid: data.eid
;
await this.feedbackModel.findOneAndUpdate(
    
        $and:
            [ 
                
                    $or:
                        [ 
                             name: data.name, 'likes.eid' : $nin: [ data.eid ]  
                        ]
                ,
                
                    $or: 
                        [
                             name: data.name 
                        ]
                
            ]
    ,
    $push: likes: newLikeDbDto ,
    new: true, upsert: true)
    .exec()
    

我不是猫鼬方面的专家,所以请帮助我如何实现这三个条件。

谢谢

【问题讨论】:

你的输出错误在哪里?你应该使用 $set,而不是 push 我需要将数据推送到数组中 那就不要用find和update了,find更新跟find一样,然后更新,你应该find并推送 【参考方案1】:

试试这个解决方案:

架构


    name:  type: String ,
    likes:  type: [  _id: false, eid:  type: Number   ], default: [] 

收集样本记录

[
    
        name: 'AA',
        likes: [eid:100,eid:101]
    ,
    
        name:'BB',
        likes:[eid:100,eid:102]
    
]

条件 1

await FeedbackModel.findOneAndUpdate(
     $or: [  name:'AA', 'likes.eid': 101 ,  name: 'AA'  ] ,
     $set:  name: 'AA' , $addToSet:  likes:  eid: 101   ,
     upsert: true, new: true 
)

条件2

await FeedbackModel.findOneAndUpdate(
     $or: [  name:'AA', 'likes.eid': 105 ,  name: 'AA'  ] ,
     $set:  name: 'AA' , $addToSet:  likes:  eid: 105   ,
     upsert: true, new: true 
)

条件 3

await FeedbackModel.findOneAndUpdate(
     $or: [  name:'CC', 'likes.eid': 101 ,  name: 'CC'  ] ,
     $set:  name: 'CC' , $addToSet:  likes:  eid: 101   ,
     upsert: true, new: true 
)

【讨论】:

以上是关于Mongoose:findOneAndUpdate 不适用于多种条件的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose:findOneAndUpdate 不返回更新的文档

Mongoose - 使用 findOneAndUpdate 更新子文档

Mongoose `findOneAndUpdate` 回调不传递更新的文档

Mongoose `findOneAndUpdate` 回调不传递更新的文档

Mongoose:findOneAndUpdate 不适用于多种条件

Mongoose findOneAndUpdate 更新多个字段