获取从 mongoimport 更新的文档结果
Get result of Documents updated from mongoimport
我正在使用 mongoimport
将 Documents
更新为 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,您必须遍历每个文档并比较当前文档和新文档以获取不同的字段。您可以:
- 通过在更新每个文档之前获取差异来利用
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)
}
- 自己比较
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
我正在使用 mongoimport
将 Documents
更新为 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,您必须遍历每个文档并比较当前文档和新文档以获取不同的字段。您可以:
- 通过在更新每个文档之前获取差异来利用
document.modifiedPaths()
ordocument.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)
}
- 自己比较
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