Mongoose - 从消息数组中删除一个对象

Mongoose - Remove an object from array of messages

我需要从 mongoose 的消息数组中删除一条消息。我该怎么做? 我的架构:

const ChatMessages = new Schema({
    room: {
        type: Schema.Types.Mixed,
        required: true
    },
    messages: [{
        sender: {
            type: String,
            required: true
        },
        text: {
            type: String,
            required: true
        },
        display: {
            type: String,
            required: true
        },
        date: {
            type: Date,
            default: Date.now,
        }

    }]
})

我的代码是:

await ChatMessages.updateOne({ room },{ $pull: { messages: { _id: new ObjectId(_id) } }}, { multi: true})

文档示例

id: ObjetId(6051f0bbe23bf3129b8f8eb6)
room:"111"
__v:0
messages: Array

我在这里用我的示例文档重现了这个问题:

{
    "_id": ObjectId("604bacf4dfe5ed598c350737")
    "array": [
        {
            "_id": ObjectId("60474814a380df6aade743cd"),
            "value": NumberInt(785)
        }
    ]
}

如果我使用 updateOne()multi 选项,它会抛出错误。 所以我用 update()multi:

执行了它
db.documents.update({ _id: ObjectId("604bacf4dfe5ed598c350737") }, {
    $pull: {
        array: {
            _id: ObjectId("60474814a380df6aade743cd")
        }
    }
}, { multi: true })

这是结果文档:

{
    "_id": ObjectId("604bacf4dfe5ed598c350737")
    "array": []
}

所以在你的情况下,保留 new ObjectId(_id) 并使用 update() 应该可以解决问题。如果 $pull 仍然存在问题,则意味着查找查询存在问题:{ room }.

更多信息:https://docs.mongodb.com/manual/reference/operator/update/pull/#remove-items-from-an-array-of-documents