Mongodb Обновление в трехуровневый внедренный документ только по значению поля - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь обновить трехуровневый встроенный документ только одним полем.я публикую свои данные ниже, в которых я пытаюсь обновить только одно поле в документе.вот моя коллекция, в которой я пытаюсь обновить значение View .{ "_id": "5bbc7614b6160b29f05854c7", "createdAt": "2018-10-09T09:34:12.604Z" "subcategories": [ { "status": "1", "_id": "5bbc762fb6160b29f05854c8", "createdAt": "2018-10-09T09:34:39.008Z", "videos": [ { "views": 0, "createdAt": "2018-10-12T11:40:08.752Z", "_id": "5bc08818ed05cf1c5e01103c", "user_id": "5ba08df7a68f5f1e43f05983", "description": "sdf", "size": "30.76 MB", "duration": "11:11", "video": "https://www.gpnext.org" }, { "views": 10, "createdAt": "2018-10-12T11:40:08.752Z", "_id": "5bc08818ed05cf1c5e01103d", "user_id": "5ba08df7a68f5f1e43f05984", "description": "qwerty", "size": "35.76 MB", "duration": "10:10", "video": "https://www.gpnext1.org" } ] }, ] }

Я пытаюсь обновить только значение Представления , но когда я выполняю приведенный ниже запрос, он удаляет все видеоданные и вставляет туда только поле просмотра.Может ли кто-нибудь направить меня к обновлению значения Views без влияния на значения других полей.Вот мой запрос на обновление значения представления.

VideoCategory.findOneAndUpdate( {'subcategories.videos._id' : mongoose.Types.ObjectId(req.body.video_id)}, { $set : { 'subcategories.$.videos': { 'views' : 4 } } }, function(err, category){ if (err) return res.send({ status: false, message: 'error in Increment'}); else return res.json({ status: true, message: 'View incremented'}); } );

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Позиционный оператор ($) работает только для массивов с одноуровневой глубиной.В вашем случае вам нужен оператор с позиционной фильтрацией , который доступен в MongoDB 3.6 или выше.Попробуйте:

db.col.update(
    { _id: "5bbc7614b6160b29f05854c7" }, 
    { $set: { "subcategories.$[subcategory].videos.$[video].views": 4 }}, 
    { arrayFilters: [ { "subcategory._id": "5bbc762fb6160b29f05854c8" }, { "video._id": "5bc08818ed05cf1c5e01103c" } ] })
0 голосов
/ 18 октября 2018

Вы устанавливаете объект json только с ключом вида, поэтому все остальные данные ожидают, что «вид» будет удален, в этом случае вам нужно использовать позиционный оператор дважды, как это

{ $set : { "subcategories.$.videos.$.views": "4" }

Но у MongoDb есть ограничение на позиционный оператор. Позиционный оператор можно использовать только один раз в запросе. Вот ссылка на проблему https://jira.mongodb.org/browse/SERVER-831

Я предлагаю два решения, но настоятельно рекомендую использовать первое

  • Создайте другую коллекцию видео и сохраните _id (указатель) видео в своем массиве, после чего вы сможете легко выполнить любой запрос на обновление, который хотите
  • Получить ваши данные, а затем внести некоторые изменения, после того как вы обновите все данные, которые выпринес
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...