1

我想更新包内嵌入子文档的 Itinirary,它本身就是一个嵌入式文档。我尝试使用索引并成功如下:

 "$set":{'packages.$.itinerary.0.to': "kausaltar"} 

但我不想在行程更新中使用像 0,1 这样的索引。请你帮帮我。

我的 JSON 架构是这样的:

  {
         "_id" : ObjectId("5e1ca76b9f96d17c449de177"),
        "org_id" : "22222222222",
        "packages" : [ 
            {
                "_id" : ObjectId("5e1ca76b9f96d17c449de17a"),
                "region" : "ppopopop",     


                "itinerary" : [ 
                    {
                        "_id" : ObjectId("5e1ca76b9f96d17c449de17d"),
                        "id" : 1,
                        "from" : "ppopopop",
                        "to" : "ashinnkn",
                        "mode" : "4444444444",
                        "day" : 2,
                        "duration_hrs" : 3
                    }, 
                    {
                        "_id" : ObjectId("5e1ca76b9f96d17c449de17c"),
                        "id" : 2,
                        "from" : "44444444444",
                        "to" : "Faketon2",
                        "mode" : "4444444444",
                        "day" : 2,
                        "duration_hrs" : 3
                    }, 
                    {
                        "_id" : ObjectId("5e1ca76b9f96d17c449de17b"),
                        "id" : 3,
                        "from" : "55555555555",
                        "to" : "ashin",
                        "mode" : "55555555",
                        "day" : 2,
                        "duration_hrs" : 3
                    }
                ],
                "image_url" : "sadfasfsa",
            }, 
            {
                "_id" : ObjectId("5e1ca76b9f96d17c449de178"),
                "region" : "bktll",
                "itinerary" : [ 
                    {
                        "_id" : ObjectId("5e1ca76b9f96d17c449de179"),
                        "id" : 1,
                        "from" : "mmkkkkm",
                        "to" : "ashin",
                        "mode" : "SkkkkA",
                        "day" : 2,
                        "duration_hrs" : 3
                    }
                ],
                "image_url" : "sadfasfsa",
           }
        ]
    }
    }

我想更新本身是嵌入式文档的包内的行程字段。我的代码是这样的:

 AgentPackage.update({
            "_id" :  mongoose.Types.ObjectId("5e1ca76b9f96d17c449de177"),
            "packages.region" : "ppopopop", 
            'packages.itinerary.id':  2,
      }, {$set: {'packages.itinerary.$$.from': "test" }}

我无法更新。我不想使用像 0,1 INSIDE 查询这样的索引。

4

2 回答 2

0

尝试这个 :

如果您的包内只有一个对象region : "ppopopop",请尝试以下操作(在大多数情况下,这应该足够了,因为您可能没有相同名称的重复区域):

AgentPackage.update({
    _id: ObjectId("5e1ca76b9f96d17c449de177"), "packages.region": "ppopopop"
}, { $set: { "packages.$.itinerary.$[item].to": 'kausaltar' } }, {
    arrayFilters: [{ 'item.id': 2 }]
})

如果您的包中有多个对象region : "ppopopop",请尝试以下操作:

AgentPackage.update({
    _id: ObjectId("5e1ca76b9f96d17c449de177"), "packages.region": "ppopopop" // Here this "packages.region": "ppopopop" is optional as _id will only bring one document else might be helpful to bring only docs with region: ppopopop right after filter. 
}, { $set: { "packages.$[eachPackage].itinerary.$[eachItinerary].to": 'kausaltar' } }, {
    arrayFilters: [{ 'eachPackage.region': "ppopopop" }, { 'eachItinerary.id': 2 }]
})

参考: 更新位置过滤

于 2020-01-13T19:48:03.067 回答
0

你可以用$arrayfilter做到这一点

db.getCollection("unit").update({_id: ObjectId("5e1ca76b9f96d17c449de177")}, { $set: { "packages.$[t].itinerary.$[d].from": "test" } },
   { arrayFilters: [ { "t.region": "ppopopop" }, {"d.id":15}]})
于 2020-01-13T19:51:44.220 回答