Монго поле обновления в массиве на основе индекса

У меня есть коллекция проектов (Projects) с записью project который имеет массив equipInfoДопустим, я хотел обновить количество индекса 1 в массиве:

"techInfo" : {    
    "equipInfo" : [ 
                {
                    "item" : {
                        "$ref" : "equipment",
                        "$id" : ObjectId("581a20cb4abab607fd17f07d")
                    },
                    "quantity" : "22800",
                    "type" : "module"
                }, 
                {
                    "item" : {
                        "$ref" : "equipment",
                        "$id" : ObjectId("581a20cb4abab607fd17f07e")
                    },
                    "quantity" : "1666",   <===== UPDATE THIS!!!!!!
                    "type" : "inverter"
                }
        ]
}

Итак, я попробовал:

    Projects.update(
        {_id: projectId},
        {$set: {"techInfo.equipInfo.1.quantity": 1000000}
    );

Но это не работает, я использую Meteor.js, кстати

4 ответа

Решение

Что вы подразумеваете под "это не работает"? Есть ли ошибка?

Следующее работает, как и ожидалось, как /server/main.js в новом метеорологическом проекте:

import { Meteor } from 'meteor/meteor';
import { Mongo  } from 'meteor/mongo'

Projects = new Mongo.Collection("projects");

Meteor.startup(() => {
    Projects.remove({})
    Projects.insert( {
        "techInfo": {
            "equipInfo": [{
                    "item": {
                        "$ref": "equipment",
                        "$id": new Mongo.ObjectID("581a20cb4abab607fd17f07d")
                    },
                    "quantity": "22800",
                    "type": "module"
                },
                {
                    "item": {
                        "$ref": "equipment",
                        "$id": new Mongo.ObjectID("581a20cb4abab607fd17f07e")
                    },
                    "quantity": "1666",
                    "type": "inverter"
                }
            ]
        }
    } )
    let techInfo = Projects.findOne();
    Projects.update({ _id: techInfo._id }, 
      { $set: { "techInfo.equipInfo.1.quantity": 1000000 } }
    );
    console.log(Projects.findOne().techInfo);
});

Если вы хотите обновить только первый объект массива вне зависимости от условий, это ваше решение

Projects.update({_id: projectId},{$set : {"techInfo.equipInfo.0.quantity" : 1000000}})

Если вы хотите пройти через элемент найти массив и обновить его, вы можете использовать это

Projects.update({_id: projectId,"techInfo.equipInfo" : {"$elemMatch" : {"type" : "module"}}},{$set : {"techInfo.equipInfo.$.quantity" : 1000000}})

Я думаю, что вам нужно это:

Projects.update(
    {_id: projectId},
    {$set: {"techInfo.equipInfo.1.quantity": 1000000}
);

Это должно работать, { до $set должен быть закрыт

Projects.update(
    {_id: projectId},
    {$set: {"techInfo.equipInfo.1.quantity": 1000000}}
);
Другие вопросы по тегам