【问题标题】:Mongoose: findOneAndUpdate not working for multiple conditionsMongoose:findOneAndUpdate 不适用于多种条件
【发布时间】: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并推送

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


【解决方案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 }
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2013-08-01
    • 2013-11-28
    相关资源
    最近更新 更多