如何在 Mongoose 中更改文档子数组的对象内的布尔值?

Posted

技术标签:

【中文标题】如何在 Mongoose 中更改文档子数组的对象内的布尔值?【英文标题】:How to change boolean value within an object of a document sub-array in Mongoose? 【发布时间】:2019-08-30 00:51:03 【问题描述】:

我有一个房间模型。其中有一个用户数组,它有自己的模型。

每个用户都有一堆不同的属性,其中一些是布尔值。知道特定房间和特定用户的 ID,我试图更改子数组中特定用户元素内的布尔值,如下所示:

Room.findOne(_id: roomId, "users" : user,  "$set" :  mutedAudio : false)
        .then(doc => 
            console.log("Unmuted audio");
            res.json(doc)
            io.in(roomId).emit('userchange');
        )
        .catch(err => 
            console.log(err);
        )

(我使用用户模型而不是用户 ID 在子数组中查找用户。无法让 ID 工作,但可以通过将对象完全与自身进行比较来获取对象。)

我得到错误:

MongoError: Unsupported projection option: $set:  mutedAudio: true 

有人知道这个问题的答案吗?

谢谢。

编辑:

const RoomSchema = new Schema(
    owner: 
        id: 
            type: String
        ,
        username: 
            type: String
        
    ,
    roomname: 
        type: String,
        required: true
    ,
    category: 
        type: String,
        required: true
    ,
    password: 
        type: String,
        required: false
    ,
    users: [UserSchema],
    messages: [
        username: 
            type: String
        ,
        message: 
            type: String
        ,
        time: 
            type: String
        
    ],
    date: 
        type: Date,
        default: Date.now
    
);

const UserSchema = new Schema(
    id: 
        type: String
    ,
    username: 
        type: String,
        required: true
    ,
    email: 
        type: String,
        required: true
    ,
    password: 
        type: String,
        required: true
    ,
    avatar: 
        type: String
    ,
    date: 
        type: Date,
        default: Date.now
    ,
    micEnabled: 
        type: Boolean,
        default: false
    ,
    mutedAudio: 
        type: Boolean,
        default: true
    
);

【问题讨论】:

【参考方案1】:

Model.findOne() 接受 4 个参数,第二个是“返回的可选字段”,这就是您收到错误的原因,猫鼬试图根据 $set: mutedAudio: true 返回的字段 $set: mutedAudio: true 第二个参数(因此被认为是一个投影选项)。 使用Model.findOneAndUpdate(),它将更新对象作为第二个参数,以及positional operator $。

  Room.findOneAndUpdate(
     "_id": roomId, "users._id": userID , "$set":  "users.$.mutedAudio": false   )
      .then(doc => 
         console.log("Unmuted audio");
         res.json(doc)
         io.in(roomId).emit('userchange');
        )
        .catch(err => 
            console.log(err);
        )

@Neil Lunn 在Mongoose find/update subdocument 中的原始答案

【讨论】:

谢谢Moad。它不再向我抛出错误,并且控制台日志“未静音的音频”有效,并且我的套接字发送一条消息,好像更改成功一样,但是当我检查 Mongodb 实例中的值时,没有任何改变。我的反应客户端上的 Redux 状态也没有收到任何更改。你知道可能出了什么问题吗? 能否为您的架构(房间和用户)提供代码? 我已将它们添加到主帖 您的查询实际上返回了Room 文档,您正在尝试在Room 文档上设置mutedAudio。看看这个问题***.com/questions/26156687/…

以上是关于如何在 Mongoose 中更改文档子数组的对象内的布尔值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mongoose 或 mongodb 查询更改架构内的方案数组内的值。?

(猫鼬)如何在用户集合中搜索会话数组属性内的对象内的令牌

mongoose#populate 在数组内的嵌套对象中返回 null

使用 mongoose 在 mongoDb 中更新数组内的对象 [重复]

合并嵌套在数组 mongoose 中的对象内的 $lookup 值

当嵌入式数组对象更改时,Mongoose 实例 .save() 不起作用