获取从 mongoimport 更新的文档结果

Get result of Documents updated from mongoimport

我正在使用 mongoimportDocuments 更新为 Collection。我正在使用 shelljs 来 运行 实际的 mongoimport 命令,就像通过 CLI 运行 一样。

例如 mongoimport docs.json -d DB -c Collection --jsonArray --upsertFields=foo,bar 这仅输出更新的 Documents 的 # - 但未提供有关确切更改内容的任何进一步详细信息。

但是,我需要能够查看哪些文档实际上是 updated/inserted,然后对这些结果进行处理。我原以为会有一些方法来获得这些 documents 的结果 Object ID(也许通过一些 -v verbose 标志)——但在做研究时,令人惊讶的是似乎有没办法。

有人知道如何使用 mongoimport 获取更新的 Documents 吗?如果真的不可能,是否有某种方法可以使用 Mongoose 来做到这一点?另外,有什么方法可以检查 Document 上更新的内容的差异,即更新插入时更改了哪些字段?谢谢!

我认为不可能从批量操作中获取此类信息。

使用 Mongoose,您必须遍历每个文档并比较当前文档和新文档以获取不同的字段。您可以:

  1. 通过在更新每个文档之前获取差异来利用 document.modifiedPaths() or document.directModifiedPaths()
const doc = await MyModel.findById(newDoc._id) // or .findOne for other upsert query conditions
if (doc) {
  const { foo, bar } = newDoc // assuming foo, are are top level fields
  doc.set({ foo, bar })
  const modifiedPaths = doc.directModifiedPaths() // should work if foo, bar are not objects
} else {
  // no previous doc, insert...
  await MyModel.create(newDoc)
}

  1. 自己比较
const { foo, bar } = newDoc
const doc = await MyModel.findByIdAndUpdate(newDoc._id, { $set: { foo, bar } }, { new: false, upsert: true })
// or .findOneAndUpdate for other upsert query conditions
/* since we passed new: false, the operation will return the original document or null if not exists */

const { foo: newFoo, bar: newBar } = doc
// compare foo & newFoo, bar & newBar