Javascript mongoose更新嵌套文档不工作

Javascript mongoose更新嵌套文档不工作,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我试图找出我做错了什么,因为moongose没有更新我的文档。仅用于测试硬编码的id node.js var id1 = "592fd471fedd311d5c76a024"; var id2 = "592fd4ad608e001d79938ba8"; Workshop.update({ _id: id1, 'themen._id': id2 }, { '$set': { 'themen.$.risikolands

我试图找出我做错了什么,因为moongose没有更新我的文档。仅用于测试硬编码的id

node.js

var id1 = "592fd471fedd311d5c76a024";
var id2 = "592fd4ad608e001d79938ba8";

Workshop.update({
        _id: id1,
        'themen._id': id2
    }, {
        '$set': {
            'themen.$.risikolandschaft': ["John", "Doe"],
        }
    },
    function(err, body) {
        if (err) {
            console.log(err)
        } else {
            console.log(body);
        }
    }
);
这里是我从MongoDB Compass复制的数据

{
"_id" : ObjectId("592fd471fedd311d5c76a024"),
"clientid" : "592cff8794738f0347609666",
"bezeichnung" : "Workshop 1.5.2017 / 10:46",
"themen" : [ 
    {
        "thema" : {
            "__v" : 0,
            "bezeichnung" : "Sturm",
            "beschreibung" : "Text",
            "_id" : "59255757b1485d0ad2a6924f"
        },
        "risikolandschaft" : [ "one", "two", "three"],
        "date" : "2017-06-01T08:47:41.944Z",
        "_id" : ObjectId("592fd4ad608e001d79938ba8")
    }
], ...
从尸体上取下原木

{ n: 0, nModified: 0, ok: 1 }
要将新项目添加到“themen”子文档中,我使用以下方法:

var new_thema = {
        _id: mongoose.Types.ObjectId(),
        date : req.body.date,
        risikolandschaft : req.body.risikolandschaft,
        thema : req.body.thema };
这里是猫鼬模式

var WorkshopSchema = mongoose.Schema({
    clientid: {
        type: String,
        required: true
    },
    bezeichnung: {
        type: String,
        required: true
    },
    stammdaten : [],
    date : Date,
    themen : []

});
“themen”没有子模式
“mongoose”:“^4.8.6”

显示您的架构和文档的JSON视图。某些内容被错误地设置为字符串,它应该是
ObjectId
值,因此被认为不匹配。从外观上看,您有几个问题。数据路径实际上是
themen.thema.\u id
,它实际上是一个“字符串”。我建议你的“猫鼬模式”,我实际上指的是“模式”,你要包括在问题中也是不正确的。这看起来像是从引用的格式迁移过来的,但不正确。好的,还有
themen.\u id
。但它看起来也像是模式问题。谢谢,我没有“themen”的子模式,因为我想让它尽可能灵活,我想通过使用“\u id:mongoose.Types.ObjectId()”,可以通过访问它。你可能想打开调试日志
mongoose.set(“debug”,true)
。我注意到
themen
只定义为一个“数组”,而实际上您并没有为它定义模式类型。我认为(事实上很确定)正因为如此,mongoose在进行查询时将提供的值作为“字符串”保留在
themen.\u id
。您可能真的希望将此数组的模式类型形式化,然后将其添加到该声明的
themen:[themenSchema]
。然后,
ObjectId
值应正确转换。显示您的模式和文档的JSON视图。某些内容被错误地设置为字符串,它应该是
ObjectId
值,因此被认为不匹配。从外观上看,您有几个问题。数据路径实际上是
themen.thema.\u id
,它实际上是一个“字符串”。我建议你的“猫鼬模式”,我实际上指的是“模式”,你要包括在问题中也是不正确的。这看起来像是从引用的格式迁移过来的,但不正确。好的,还有
themen.\u id
。但它看起来也像是模式问题。谢谢,我没有“themen”的子模式,因为我想让它尽可能灵活,我想通过使用“\u id:mongoose.Types.ObjectId()”,可以通过访问它。你可能想打开调试日志
mongoose.set(“debug”,true)
。我注意到
themen
只定义为一个“数组”,而实际上您并没有为它定义模式类型。我认为(事实上很确定)正因为如此,mongoose在进行查询时将提供的值作为“字符串”保留在
themen.\u id
。您可能真的希望将此数组的模式类型形式化,然后将其添加到该声明的
themen:[themenSchema]
。然后,
ObjectId
值应正确转换。