Использование MongoDB $ set для обновления нескольких вложенных документов - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть такие статьи-документы:

{
    "_id" : "rNiwdR8tFwbTdr2oX",
    "createdAt" : ISODate("2018-08-25T12:23:25.797Z"),
    "title" : "Happy",
    "lines" : [ 
        {
            "id" : "5efa6ad451048a0a1807916c",
            "text" : "Test 1",
            "align" : "left",
            "indent" : 0
        }, 
        {
            "id" : "ae644f39553d46f85c6e1be9",
            "text" : "Test 2"
        }, 
        {
            "id" : "829f874878dfd0b47e9441c2",
            "text" : "Test 3"
        }, 
        {
            "id" : "d0a46ef175351ae1dec70b9a",
            "text" : "Test 4"
        }, 
        {
            "id" : "9bbc8c8d01bc7029220bed3f",
            "text" : "Test 5"
        }, 
        {
            "id" : "6b5c02996a830f807e4d8e35",
            "text" : "Test 6",
            "indent" : 0
        }
    ]
}

Мне нужно обновить несколько строк.Например, у меня есть массив с идентификаторами строки, которые должны быть обновлены.

let lineIds = [
    "5efa6ad451048a0a1807916c", 
    "829f874878dfd0b47e9441c2", 
    "6b5c02996a830f807e4d8e35"
];

Поэтому я пытаюсь обновить атрибуты "attr" для "строк", и я делаю следующее:

    'articles.updateLines': function (articleId, lineIds, attr, value) {
        return Articles.update({
                '_id': articleId,
                'lines.id': { $in: lineIds }
            },
            {
                $set: {
                    ['lines.$.' + attr]: value
                }
            },
            { multi: true }
        );
    }

Проблема в том, что обновляется только первая строка (с id = "5efa6ad451048a0a1807916c").Есть идеи?Спасибо!:)

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Вы можете использовать $ [].Это будет работать только MongoDB версии 3.6 и выше.

Ссылка: https://docs.mongodb.com/manual/reference/operator/update/positional-all/

 You can also see this stackoverflow question reference: 

Как добавить новое значение ключа или изменить ключзначение внутри вложенного массива в MongoDB?

Вы можете преобразовать приведенный ниже запрос в свою функцию

 db.col.update(
  { '_id':"rNiwdR8tFwbTdr2oX", },
  { $set: { "lines.$[elem].text" : "hello" } },     
  {  arrayFilters: [ { "elem.id": { $in: lineIds } } ],
  multi: true
 })
0 голосов
/ 27 декабря 2018

'lines.id': {$ in: lineIds}

Это не будет работать, потому что lines - это массив.

Что я понимаю из вашего вопроса, вы можете подготовить новый массив с правильной обработкой и заменить массив lines новым.Вот идея, как это сделать:

'articles.updateLines': function (articleId, lineIds, attr, value) {
    let lines = Articles.findOne(articleId).lines;
    // prepare a new array with right elements
    let newArray = [];
    for(let i=0; i<lines.length; i++){
        if(lineIds.includes(lines[i].id)){
            newArray.push(value)
        }
        else newArray.push(lines[i])
    }
    return Articles.update({
            '_id': articleId,
        },
        {
            $set: {
                lines: newArray
            }
        }
    );
}
...