Как сослаться на обновляемые записи в запросе mongoDB? - PullRequest
0 голосов
/ 03 марта 2020

Ниже моя коллекция

[{documentId: 123, id: uniqueValue }]

Ожидаемый результат

[{documentId: 123, id: id1,uniqueKey: uniqueValue }]

Как мне ссылаться на столбец "id" для текущих обновлений записей, также столбцом id может быть все, для чего мой внешний запрос дает мне имя столбца

 db.supplier.updateMany( { documentId : 123}, { $set: { "uniqueKey": id} } );

, поэтому в вышеприведенном запросе "id" идет наподобие externalObject.mapping.idColumn, которое я хочу заменить в вышеприведенном запросе.


Весь смысл в том, чтобы создать индекс по столбцу, а текущая коллекция не имеет фиксированного имени столбца, по которому я хочу запустить запрос

Пример

Существует две коллекции collectionOne и collectionTwo для каждая документ в коллекцииОдно в коллекции несколько документов. docId используется для поиска.


collectionOne
[{
    docId :123,
    col1 : lookupColumn
    metaData: "some metaData",
    extra : "extra columns"
}, ... ]

 collectionTwo
    [{
       docId :123,
        lookupColumn:"1",
        a:"A",
        b:"B" ....
    },
    {   docId :123,
        lookupColumn:"2",
        a:"A",
        b:"B" ....
    }
    {   docId :123,
        lookupColumn:"3",
        a:"A",
        b:"B" ....},.....]

lookupColumn в collectionTwo может иметь другое имя и отображение это имя задается в collectionOne полем col1 (которое всегда одинаково), в этом примере значение col1 равно lookupColumn , поэтому я хочу создать столбец newKey и скопируйте в него значение lookupColumn .

Итак, я обнаружил ниже Query

db.collectionOne.find({}).forEach(function(obj) {   
    if(obj.columns) {
        existingColumn =obj.columns.col1;
        db.collectionTwo.updateMany( { docId: obj.docId}, { $set: { "newKey": existingColumn} } );
        }
}

Проблема в том, что я не могу выбрать имя существующего столбца, используя переменную существующиеColumn Я также попытался использовать $, который вставляет $ "существующий столбец" в качестве значения newKey.

Я обновил запрос еще одним l oop поверх collectionTwo, но я чувствую, что оптимизирован и ненужен.

1 Ответ

0 голосов
/ 04 марта 2020

До go от

{documentId: 123, id: uniqueValue }

до

{documentId: 123, id: id1, uniqueKey: uniqueValue }

Использовать конвейерный стиль обновления, который позволяет использовать синтаксис агрегации:

db.collection.update({documentId: 123}, [{$set:{uniqueKey:"$id", id:"id1"}}])

РЕДАКТИРОВАТЬ

Последнее редактирование вопроса делает это намного более понятным.

Вы были почти там.

В MongoDB 4.2 второй аргумент updateMany принимает либо документ обновления, который вы использовали:

db.collectionTwo.updateMany( { docId: obj.docId}, { $set: { "newKey": existingColumn} } );

, либо он может принимать конвейер, подобный агрегации, но не все стадии доступны. Для этого, если вы сделаете второй аргумент массивом, чтобы он распознавался как конвейер, вы можете использовать структуру "$ variable". Поскольку у вас уже есть имя поля в переменной javascript, добавьте «$» к имени поля:

db.collectionTwo.updateMany( { docId: obj.docId}, [{ $set: { "newKey": "$" + existingColumn} }] );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...