Как установить одно поле данных в другое поле даты в том же объекте коллекции mongodb - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь редактировать поля записей в коллекции.Я проверяю, меньше ли дата последнего обновления, чем дата публикации.Если это так, то запись, вероятно, неисправна, и мне нужно сделать дату последнего обновления такой же, как дата публикации.Я создал для него следующий запрос на монго: -

           db.runCommand({ aggregate: "collectionNameHere",pipeline: [
                 {
                   $project: {
                     isFaulty: {$lt: ["$lastUpdated","$published"]}
                   }
                 },{
                   $match: {
                     isFaulty: true
                   }
                 },{
                   $addFields: {
                     lastUpdated: "$published"
                   }
                 }]
              })

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

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Невозможно обновить документ с тем же полем.Вы можете использовать $out агрегацию

db.collection.aggregate([
  { "$match": { "$expr": { "$lt": ["$lastUpdated", "$published"] }}},
  { "$addFields": { "lastUpdated": "$published" }}
])

здесь, но она всегда создает новую коллекцию в качестве «вывода», что также не является решением здесь.

Итак, наконец, вам нужно использовать некоторую итерацию, чтобы сначала найти документ с помощью запроса find, а затем обновить его.А с async await теперь довольно просто работать с этим типом вложенных асинхронных циклов.

const data = await db.collection
.find({ "$expr": { "$lt": ["$lastUpdated", "$published"] }})
.project({ lastUpdated: 1 })
.toArray()

await Promise.all(data.map(async(d) => {
  await db.collection.updateOne({ _id: d._id }, { $set: { lastUpdated: d.published }})
}))
0 голосов
/ 14 декабря 2018

Вы делаете ошибку, пытаясь обновить с агрегацией, что невозможно.Вы должны использовать команду обновления для достижения своей цели.

Не могу проверить это прямо сейчас, но это должно сделать работу:

db.collection.update({
  $expr: {
    $lt: [
      "$lastUpdated",
      "$published"
    ]
  }
},
{$set:{lastUpdated:"$published"}}
)
...