Уникальный индекс в mongodb с использованием db.command - PullRequest
0 голосов
/ 19 июня 2020

Я использую mongodb с PyMongo, и я хотел бы отделить определение схемы от остальной части приложения. У меня есть файл user_schema.json со схемой для user коллекции:

{
  "collMod": "user",
  "validator": {
    "$jsonSchema": {
      "bsonType": "object",
      "required": ["name"],
      "properties": {
        "name": {
          "bsonType": "string"
        }
      }
    }
  }
}

Затем в db.py:

with open("user_schema.json", "r") as coll:
    data = OrderedDict(json.loads(coll.read())) # Read JSON schema.
    name = data["collMod"] # Get name of collection.
    db.create_collection(name) # Create collection.
    db.command(data) # Add validation to the collection.

Есть ли способ добавить уникальный индекс к name поле в коллекции user без изменения db.py (только путем изменения user_schema.json)? Я знаю, что могу использовать это:

db.user.create_index("name", unique=True)

, однако тогда у меня есть информация о коллекции в двух местах. Я хотел бы, чтобы вся конфигурация коллекции была в файле user_schema.json. Мне нужно что-то вроде этого:

{
  "collMod": "user",
  "validator": {
    "$jsonSchema": {
       ...
    }
  },
  "index": {
    "name": {
      "unique": true
    }
  }
}

1 Ответ

0 голосов
/ 19 июня 2020

Нет, вы не сможете сделать это, не изменив db.py.

Содержимое user_schema. json - это объект, который можно передать в db.command для запуска collmod command.

Чтобы создать индекс, вам нужно запустить команду createIndexes или один из помощников, который это вызывает.

It Невозможно выполнить оба этих действия с помощью одной команды.

Простая модификация - сохранить массив команд для запуска в user_schema. json, а db.py выполнить итерацию по массиву и запустить каждая команда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...