Mongodb仅在字段值上更新为三级嵌入式文档

时间:2018-10-18 12:57:19

标签: node.js mongodb mongoose mongodb-query

我正在尝试仅在一个字段中更新三级嵌入式文档。我在下面发布我的数据,其中我试图仅将一个字段更新到文档中。这是我要在其中更新查看值的收藏夹。 { "_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" } ] }, ] }

我仅尝试更新观看次数值,但是当我执行下面提到的查询时,它正在删除所有视频数据并仅在其中插入观看次数字段。有人可以指导我在不影响其他字段值的情况下更新“视图”值。这是我的更新视图值的查询。

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 :(得分:1)

位置运算符(<Selectpicker<Location> ... />)仅适用于具有一级深度的阵列。在您的情况下,您需要positional filtered运算符,该运算符在MongoDB 3.6或更高版本中可用。试试:

$

答案 1 :(得分:0)

您将json对象设置为仅具有视图键,这就是为什么所有其他数据都希望删除“视图”的原因,在这种情况下,您需要使用位置运算符两次,就像这样

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

但是MongoDb在位置运算符上有局限性。 位置运算符只能在查询中使用一次。 这是问题链接https://jira.mongodb.org/browse/SERVER-831

我建议两种解决方案,但强烈建议使用第一种解决方案

  • 创建另一个视频收藏集,并将视频_id(指针)保存到数组中,这样您就可以轻松进行所需的任何更新查询
  • 获取数据,然后进行一些更改,然后更新获取的全部数据