如何在 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 中更新数组内的对象 [重复]