Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongoose-如何更新数组中的对象,然后对更新后的数组进行排序?_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript Mongoose-如何更新数组中的对象,然后对更新后的数组进行排序?

Javascript Mongoose-如何更新数组中的对象,然后对更新后的数组进行排序?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我有以下文件 { "_id": { "$oid": "5bca528b49079d64dd4cea5d" }, "song_queue": [ { "song_id": "best", "vote": 1 }, { "song_id": "west", "vote": 1 } ], "room_id": "FHWAN", "__v": 0 我的问题是,我需要首先更新其中一首歌曲的投票,然后根据投票计数重新排列数组的顺序 我有一种方法可以通

我有以下文件

{
"_id": {
  "$oid": "5bca528b49079d64dd4cea5d"
},
"song_queue": [
  {
     "song_id": "best",
     "vote": 1
  },
  {
    "song_id": "west",
    "vote": 1
  }
],
"room_id": "FHWAN",
"__v": 0
我的问题是,我需要首先更新其中一首歌曲的投票,然后根据投票计数重新排列数组的顺序

我有一种方法可以通过两个单独的查询来完成

// Give the song an upvote.
await Room.findOneAndUpdate(
  { "song_queue.song_id": song.song_id },
  {$set: { "song_queue.$.vote": song.votes }},
  { new: true }
);

// Sort the queue.
room = await Room.findOneAndUpdate(
  { room_id: data.room_id },
  { $push: { song_queue: { $each: [], $sort: { vote: -1 } } } },
  { new: true }
);

有没有办法将两个查询合并为一个查询,或者使其更简洁?我希望有一个查询更新song_队列中的song,然后在更改后对数组进行排序。

无法合并此查询,因为更新参数中的操作顺序不能保证被保留,因此这样的代码可能无法正确运行,因为您无法确定更新song_队列是否正确。$。请投票在排序song_队列之前发生以下情况:

await Room.findOneAndUpdate(
  { "song_queue.song_id": song.song_id },
  {
    $set: { "song_queue.$.vote": song.votes },
    $push: { song_queue: { $each: [], $sort: { vote: -1 } } }
  },
  { new: true }
);
优化数据库查询的方法是使用只需要一次往返MongoDB而不是两次往返的操作