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

时间:2018-10-19 22:59:31

标签: 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

我的问题是,我需要首先更新其中一首歌曲的投票,然后根据投票计数重新排列数组的顺序。

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

// 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_queue中的歌曲,然后在更改后对数组进行排序。

1 个答案:

答案 0 :(得分:1)

由于无法保证保留update参数内的操作顺序,因此无法合并此查询,因此这样的代码可能无法正确运行,因为您不确定更新{ {1}}在song_queue.$.vote排序之前发生:

song_queue

使用Ordered Bulk Write操作可以优化数据库查询,这将使MongoDB往返仅进行一次,而不是两次。