【问题标题】:Mongodb : array element projection with findOneAndUpdate doesn't work?Mongodb:使用 findOneAndUpdate 进行数组元素投影不起作用?
【发布时间】:2023-03-09 14:40:01
【问题描述】:

我正在使用 Mongoose,我正在尝试更新数组元素并将其重新更新。 这是我的文档结构:

{   name:String,
    friends:[
        {   name:String,
            age:Number
        }
    ]
}

当我执行以下查询时,我得到了结果中的所有朋友,但我只想找回 25 岁的朋友:

theCollection.findOneAndUpdate(
    {   name : 'cherif',
        'friends.name':'kevin'
    },
    {   $set:{
            'friends.$.age':25
        }
    },
    {   friends:
        {   $elemMatch:
            {   age : 25 } 
        }
    },
    function(err,result){
        if (!err) {
            console.log(result);
        }});

【问题讨论】:

    标签: mongodb mongoose mongodb-query


    【解决方案1】:

    由于the docs 为findOneAndUpdate 指定,您需要将投影对象作为options 参数的select 属性包含:

    theCollection.findOneAndUpdate(
        {   name : 'cherif',
            'friends.name':'kevin'
        },
        {   $set:{
                'friends.$.age':25
            }
        },
        {   select: { 
                friends: {
                   $elemMatch: 
                   {   age : 25 } 
                }
            }
        },
        function(err,result){
            if (!err) {
                console.log(result);
            }
        });
    

    【讨论】:

    • 这里可以使用$投影吗?例如Doc.findOneAndUpdate({ _id: id, 'comments._id': cmtId }, {...}, { select: 'comments.$': 1 })。我已经尝试过了,但奇怪的是它返回了{ comments: [{}, {}, {}], _id:... }
    • @KwiZ 你有没有找到解决方案?我正在尝试以相同的方式使用 $ 投影,但没有运气!
    • @admrply 继续发布一个新问题,详细说明您正在尝试做什么。
    • @KwiZ 的答案是使用 0 而不是 $ ( { select: 'cmets.0': 1 })
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-24
    • 2021-06-18
    • 2016-03-26
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多