猫鼬:findOneAndUpdate 不适用于多种情况

时间:2021-07-22 10:44:14

标签: node.js mongodb mongoose mongodb-query nestjs

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

例如

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

来自 API 调用,我正在传递以下值

条件 1


{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()
    
}

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

谢谢

1 个答案:

答案 0 :(得分:0)

试试这个解决方案:

架构

{
    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 }
)