Обновить поле с переменной метеор монго - PullRequest
0 голосов
/ 04 июля 2018

У меня есть одна коллекция под названием "Города" с этим документом внутри:

{
    "_id" : "vK4PvdNBfBbdv92PH",
    "ownerId" : "J8MpsWChPQdET6jwQ",
    "createdAt" : ISODate("2018-07-04T07:25:28.406Z"),
    "spot1" : {
        "construction" : false,
        "constructingBuildingName" : "",
        "buildingName" : "factory",
        "level" : 1,
        "startTime" : 0,
        "finishTime" : 0
    },
    "spot2" : {
        "construction" : false,
        "constructingBuildingName" : "",
        "buildingName" : "",
        "level" : 0,
        "startTime" : 0,
        "finishTime" : 0
    },
    "spot3" : {
        "construction" : false,
        "constructingBuildingName" : "",
        "buildingName" : "",
        "level" : 0,
        "startTime" : 0,
        "finishTime" : 0
    }
}

Что я пытаюсь сделать, так это обновить в этом случае поля spot2s переменными.

переменная spotName определяет, какое поле spot нужно обновить. обновить startTime, finishTime, constructBuildingName, изменить конструкцию на true

'buildNewBuilding': function (userid, buildingid, spotnumber) {
    var spotName = "spot" + spotnumber.toString();
    var data = Buildings.find({_id: buildingid}).fetch();
    var constructingBuildingName = data[0].name;
    var startTime = Math.floor(Date.now() / 1000);
    var finishTime = startTime + data[0].time;


    Towns.update({ownerId: userid}, {}) //??
    //update startTime,finishTime,constructingBuildingName,change construction to true

}

1 Ответ

0 голосов
/ 04 июля 2018

Во-первых, вам следует пересмотреть структуру данных, которая у вас есть. Пронумерованные ключи обычно не рекомендуется. В вашем случае было бы лучше использовать массив точек, чтобы получить больше преимуществ от механизма запросов монго.

Единственный случай, когда вы должны сохранить свою структуру, это если вы на 100% уверены, что вам не нужно иметь 4 места на город.

{
    "_id" : "vK4PvdNBfBbdv92PH",
    "ownerId" : "J8MpsWChPQdET6jwQ",
    "createdAt" : ISODate("2018-07-04T07:25:28.406Z"),
    "spots" : [
        {
            "name": "spot1",
            "construction" : false,
            "constructingBuildingName" : "",
            "buildingName" : "factory",
            "level" : 1,
            "startTime" : 0,
            "finishTime" : 0
        },
        {
            "name": "spot2",
            "construction" : false,
            "constructingBuildingName" : "",
            "buildingName" : "",
            "level" : 0,
            "startTime" : 0,
            "finishTime" : 0
        },
        {
            "name": "spot3",
            "construction" : false,
            "constructingBuildingName" : "",
            "buildingName" : "",
            "level" : 0,
            "startTime" : 0,
            "finishTime" : 0
        }
    ]
}

Тогда я советую вам посмотреть документацию mongoDB здесь . Это объясняет, как сделать такое обновление, используя $elemMatch

'buildNewBuilding': function (userid, buildingid, spotnumber) {
    var spotName = "spot" + spotnumber.toString();
    var data = Buildings.find({_id: buildingid}).fetch();
    var constructingBuildingName = data[0].name;
    var startTime = Math.floor(Date.now() / 1000);
    var finishTime = startTime + data[0].time;


    Towns.update({ownerId: userid, spots: {$elemMatch: {name: spotName}}}, {$set: {
        "spots.$.constructingBuildingName": constructingBuildingName,
        "spots.$.startTime": startTime,
        "spots.$.finishTime": finishTime,
        "spots.$.construction": true,
    }}) 


}
...