如何通过ID数组查找文档并通知不匹配的ID

时间:2018-07-28 14:41:55

标签: node.js mongodb mongoose

正如标题所述,我有一个ID数组,我想strmqm -x QMHA1 。我完全可以通过以下方式从ID数组中提取文档:

find

但是,在某些情况下,与ID相关联的文档已被删除。因此,是否有可能会收到有关 DID NOT MATCH (又称为 DELETED )的ID的通知?

谢谢

1 个答案:

答案 0 :(得分:3)

我认为mongo无法返回不匹配的结果,但是您可以使用返回的结果,并使用lodash这样的js实用程序将其与ids列表进行比较。

import { difference, map } from 'lodash'
// const { difference, map } = require('lodash')

(async () => {
    const results = await model.find({_id: {$in: ids}}).lean().exec()
    const deleted = difference(ids, map(results, '_id'))

    console.log(deleted)

})()

另一种方法是在可以使用 $setDifference 运算符的地方使用聚合框架。可以在以下管道中应用它,以获取已删除/不匹配的文档ID:

const _ids = ids.map(id => mongoose.Types.ObjectId(id))
const pipeline = [
    { '$facet': {
        'matched': [
            { '$match': { '_id': { '$in': _ids } } },
        ]
    } },
    { '$addFields': {
        'deleted': {
           '$setDifference': [
               _ids, { '$map': {
                   'input': '$matched',
                   'as': 'el',
                   'in': '$$el._id'
               } }
           ]
        }
    } }       
]

model.aggregate(pipeline).exec((err, results) => {
    console.log(results)
})