Ошибка MongoDB $push в массиве массива: в области видимости для сокращенного свойства ‘elements’ не существует значения

#database #mongodb #typescript #mongodb-query #push

#База данных #mongodb #машинопись #mongodb-запрос #толкать

Вопрос:

Я хочу добавить данные в элементы, но получаю ошибку. Как решить эту проблему mongodb / typescript?

Ошибка попытки 1: в области видимости для сокращенного свойства ‘elements’ не существует значения. Либо объявите его, либо укажите initializer.ts(18004)

Попытка 1

   async add<T extends { id: string; parentID: string, elementNum: number, name: string, link: string}>(collectionName: string, args: T) {
    const db = await this.getDB();
    const collection = db.collection(collectionName);

    return new Promise((resolve, reject) => {
        collection.updateOne({ id: args.id }, {$push: {elements[args.elementNum]: {id: uuid(), name: args.name, link: args.link, elements: [] }}}, (err, res) => {
          if (err) {
            reject(err);
          }
          resolve(res);
        });
    });
  }
 

Попытка 2
изменила следующее

     collection.updateOne({ id: args.id }, {$push: {elements: {id: uuid(), name: args.name, link: args.link, elements: [] }}},
 

Попытка 2 приводит к добавлению Null в конце

         {
            "id": "1",
            "name": "wk1",
            "iconFile": "icon.png",
            "elements": [
                [
                    {
                        "id": "2",
                        "name": "element2",
                        "link": "https",
                        "elements": [
                            {
                                "id": "1",
                                "name": "element1",
                                "link": "https:"
                            }
                        ]
                    }
                ],
                [
                    {
                        "id": "3",
                        "name": "element3",
                        "link": "https://",
                        "elements": [
                            {
                                "id": "4",
                                "name": "w",
                                "link": "http:/"
                            }
                        ]
                    }
                ],
                [
                    {
                        "id": "3",
                        "name": "element3",
                        "link": "https://",
                        "elements": [
                            {
                                "id": "4",
                                "name": "w",
                                "link": "http://"
                            }
                        ]
                    },
                    {
                        "id": "3",
                        "name": "element3",
                        "link": "https://",
                        "elements": [
                            {
                                "id": "4",
                                "name": "w",
                                "link": "http://www."
                            }
                        ]
                    }
                ],
                null,
            ]
        }
 

Чего я хочу добиться, так это следующего

 
        {
            "id": "1",
            "name": "wk1",
            "iconFile": "icon.png",
            "elements": [
                [
                    {
                        "id": "2",
                        "name": "element2",
                        "link": "https",
                        "elements": [
                            {
                                "id": "1",
                                "name": "element1",
                                "link": "https:"
                            }
                        ]
                    },
                    {
                                "id": "newid",
                                "name": "newname",
                                "link": "newlink"
                                "elements":[]
                    }
                ],
                [
                    {
                        "id": "3",
                        "name": "element3",
                        "link": "https://",
                        "elements": [
                            .......
            ]
        }
 

Ответ №1:

Демонстрация — https://mongoplayground.net/p/Dnmg3lL2891

Использовать — $[]

Оператор all positional $[] указывает, что оператор update должен изменить все элементы в указанном поле массива.

Оператор $ [] имеет следующий вид:

{ <update operator>: { "<array>.$[]" : value } }

 db.collection.update({ _id: 1, "add.id": "1"},
{ $push: { "add.$[].elements": { id: "3", name: "a",  link: "" } } })
 

Демонстрация для отправки массива вместо объекта — https://mongoplayground.net/p/dh3NSutIv4 —

 db.collection.update({ _id: 1, "add.id": "1"},
{ $push: { "add.$[].elements": [{ id: "3", name: "a",  link: "" }] } })
 

 const args = {};
args.elementNum = 0;

const update = {
  [`add.$[].elements.${args.elementNum}`]: {
    a: 1
  }
};

console.log(update);

//collection.updateOne({ id: args.id }, update); // use like this 

Комментарии:

1. @javascriptnoob Я не понял вашу точку зрения, пожалуйста, проверьте демонстрацию, мы продвигаемся внутрь add.elements . Это то, что вам нужно, верно?

2. @javascriptnoob Проверьте это mongoplayground.net/p/FKdPBY9FrFg вы можете уточнить add.$[].elements.0 . Это то, что вы ищете?

3. @javascriptnoob вы можете передать "add.$[].elements." args.elementNum в JS, что приведет к add.$[].elements.0 ?

4.Или с помощью developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /… add.$[].elements.${args.elementNum}

5. Может показать точный код, что вы пробовали?