$ PullAll через документы - мангуст - PullRequest
1 голос
/ 28 апреля 2020

В моем примере я пытаюсь найти эффективный способ удаления записей listId из списка наблюдения пользователя. Каждая коллекция пользователей имеет массив строк наблюдения, в котором пользователи могут хранить элементы, которые они наблюдают.

Sample Do c:

 "watchlist": [
    "5ea8449842025217ccff6aec",
    "5ea844eb42025217ccff6aee",
    "5ea8452b42025217ccff6af1"
  ],

Чтобы поддерживать чистую базу данных, я создаю функцию таймера azure для частого развертывания в найти и удалить списки элементов списков, которые больше не существуют. Там может быть много пользователей, которые имеют одинаковые записи id в своем списке наблюдения. Поэтому мне нужно очистить их с помощью регулярных проверок.

Запрос:

Post.find({
  $and: [
    { watchlistCleaned: false },
    { auctionEndDateTime: { $lte: Date.now() } }
  ]
}).select("_id").then((res) => {

  for (let i = 0; i < res.length; i++) {

    console.log("res[i]")
    console.log(res[i]._id)


  //pretty sure this would remove the whole watchlist instead of one item so this wouldn't be ideal. 
  //It's needs to pull the items out on a multiple document scale

   // User.deleteMany({ _id: res[i]._id },{watchlist: {$in: res[i]}})

  }

})

Желаемый результат:

 { _id: 5ea84412048bf54164fe9983 }
 res[i]
 { _id: 5ea8449842025217ccff6aec }
 res[i]
 { _id: 5ea844c042025217ccff6aed }
 res[i]
 { _id: 5ea844eb42025217ccff6aee }
 res[i]
 { _id: 5ea844ed42025217ccff6aef }
 res[i]
 { _id: 5ea844ee42025217ccff6af0 }
 res[i]
 { _id: 5ea8452b42025217ccff6af1 }
 res[i]
 { _id: 5ea85daac6e12a10b09a75a5 }

1 Ответ

1 голос
/ 28 апреля 2020

Из вашего текущего кода:

 User.deleteMany()
 /** Will actually delete docs from users collection, you need to use .update() or .findAndUpdate() to alter fields inside docs */

Если res является массивом идентификаторов списков, то вы можете сделать это:

Post.distinct("_id", { watchlistCleaned: false, auctionEndDateTime: { $lte: Date.now() } }).then((res) => {
  /** So `res` will be an array of unique `_id`'s of Post collection which matches given conditions */
  User.updateMany(
    { watchlist: { $in: res } }, /** get users who have listings ids  */
    {$pullAll : { watchlist : res } } /** pull all listing ids */
  );
});
...