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` 回调不传递更新的文档