Поле с префиксом доллара ($) '$ oid' в 'features.0._id. $ Oid' недопустимо для хранения - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть следующая коллекция Mon go, прикрепленная ниже. это существующая, не новая коллекция создана, я пытаюсь добавить sh новый элемент в массив функций, но я не могу этого добиться из-за следующей ошибки: Поле с префиксом $ ($) '$ oid 'in' features.0._id. $ oid 'недопустим для хранилища. с использованием этого сценария:

db.getCollection("test").update({ _id: "RYB0001" },
{
  $push: {
    "features": {
      "_id": {
          "$oid": ObjectId(),
      },
      "featureItems": [],
      "typeId": "type3"
    }
   }
});

Если это проблема с версией драйвера, любой обходной путь, который я могу сделать для pu sh новый элемент в текущей коллекции? Версия MongoDb: 4.0.4 Пн go Скриншот коллекции

1 Ответ

0 голосов
/ 10 февраля 2020

Обозначение $ oid является частью Расширенного MongoDB JSON. Я предполагаю, что данные в вашей базе данных на самом деле не имеют этой пары ключ-значение, и они были представлены таким образом только после использования чего-то вроде JSON.stringify(obj)

> db.test.find({});
{ "_id" : "RYB0001", "features" : [ { "_id" : ObjectId("5e40d46a97abdef3faa0d5d9"), "featureItems" : [ ], "typeId" : "type3" } ] }
> JSON.stringify(db.test.find({})[0]);
{"_id":"RYB0001","features":[{"_id":{"$oid":"5e40d46a97abdef3faa0d5d9"},"featureItems":[],"typeId":"type3"}]}

Вам нужно будет сгенерировать новый ObjectId, используя его конструктор "_id": new ObjectId(), обратите внимание на ключевое слово new, думаю, @Thilo, возможно, пропустил это в своем комментарии.

db.getCollection("test").update({ _id: "RYB0001" },
{
  $push: {
    "features": {
      "_id": new ObjectId(),
      "featureItems": [],
      "typeId": "type3"
    }
   }
});
...