Nano Hash - криптовалюты, майнинг, программирование

Добавить новые поля в определенный элемент коллекции в MongoDB pymongo

Я пытаюсь обновить существующий элемент массива, добавив в него новые поля.

...
{
   "_id": "f08b466a-163b-4d9e-98f5-d900ef0f1a26",
   "firstName": "foo",
   "result": [
      { 
         "_id":"957ee97d-d461-4d6c-8a80-57351bdc29f7",
         "subjectName":"Mathematics",
         "marks": 60
      },
      { 
         "_id":"0591d9a0-fd0f-4876-9bd3-dec4d5ab452e",
         "subjectName":"Science",
         "marks": 70
      },
      { 
         "_id":"21f42104-791b-4522-81ce-f7ae1b30d075",
         "subjectName":"Social science",
         "marks": 50
      }
   ]
},
...

Теперь я хочу добавить новое поле в предмет науки под названием «Избранное: правда».

как,

{
   "_id": "f08b466a-163b-4d9e-98f5-d900ef0f1a26",
   "firstName": "foo",
   "result": [
      { 
         "_id":"957ee97d-d461-4d6c-8a80-57351bdc29f7",
         "subjectName":"Mathematics",
         "marks": 60
      },
      { 
         "_id":"0591d9a0-fd0f-4876-9bd3-dec4d5ab452e",
         "subjectName":"Science",
         "marks": 70
         "isFavorite": true   #-----------------New field----------
      },
      { 
         "_id":"21f42104-791b-4522-81ce-f7ae1b30d075",
         "subjectName":"Social science",
         "marks": 50
      }
   ]
},
...

Что я пробовал до сих пор?

from pymongo import MongoClient
...

collection = mongoInstance["student"]
student = collection.find_one({"_id": "f08b466a-163b-4d9e-98f5-d900ef0f1a26"})

for result in student["result"]:
    if result["_id"] == "0591d9a0-fd0f-4876-9bd3-dec4d5ab452e":
         result["isFavorite"] = True
         break

collection.update_one({"_id": "f08b466a-163b-4d9e-98f5-d900ef0f1a26"}, {"$set": student })

Это работает, но я считаю, что может быть простой способ просто найти студенческий документ по его идентификатору и добавить новое поле в элемент массива по элементу._id.

Ищем какой-нибудь элегантный запрос Mongodb для поиска и обновления определенного элемента массива.


  • Я не помечаю его как дубликат stackoverflow.com/questions/29012328/ только потому, что он спрашивает конкретно о pymongo, но на самом деле это вопрос синтаксиса соединения. Запрос точно такой же. Элегантная магия монго называется позиционным оператором $. 03.06.2020

Ответы:


1

@Alex Blex был прав в отношении позиционного оператора; синтаксис pymongo очень похож:

db.mycollection.update_one({'_id': 'f08b466a-163b-4d9e-98f5-d900ef0f1a26',
                            'result._id': '0591d9a0-fd0f-4876-9bd3-dec4d5ab452e'},
                           {'$set': {'result.$.isFavorite': True}})

Полный пример с использованием предоставленных образцов данных:

from pymongo import MongoClient
import pprint

db = MongoClient()['mydatabase']

db.mycollection.insert_one({
    '_id': 'f08b466a-163b-4d9e-98f5-d900ef0f1a26',
    'firstName': 'foo',
    'result': [
        {
            '_id': '957ee97d-d461-4d6c-8a80-57351bdc29f7',
            'subjectName': 'Mathematics',
            'marks': 60
        },
        {
            '_id': '0591d9a0-fd0f-4876-9bd3-dec4d5ab452e',
            'subjectName': 'Science',
            'marks': 70
        },
        {
            '_id': '21f42104-791b-4522-81ce-f7ae1b30d075',
            'subjectName': 'Social science',
            'marks': 50
        }
    ]
})

db.mycollection.update_one({'_id': 'f08b466a-163b-4d9e-98f5-d900ef0f1a26',
                            'result._id': '0591d9a0-fd0f-4876-9bd3-dec4d5ab452e'},
                           {'$set': {'result.$.isFavorite': True}})

pprint.pprint(list(db.mycollection.find())[0])

результат:

{'_id': 'f08b466a-163b-4d9e-98f5-d900ef0f1a26',
 'firstName': 'foo',
 'result': [{'_id': '957ee97d-d461-4d6c-8a80-57351bdc29f7',
             'marks': 60,
             'subjectName': 'Mathematics'},
            {'_id': '0591d9a0-fd0f-4876-9bd3-dec4d5ab452e',
             'isFavorite': True,
             'marks': 70,
             'subjectName': 'Science'},
            {'_id': '21f42104-791b-4522-81ce-f7ae1b30d075',
             'marks': 50,
             'subjectName': 'Social science'}]}
03.06.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..