获取更新文档的 ObjectID

Get ObjectID of updated document

我正在尝试使用 upsert 更新父文档及其所有子文档 ID 的数组。问题是只有在更新插入导致插入发生时才会返回 ID。

我有以下代码,在插入新子项时可以使用,但是一旦更新一个子项,由于结果的 upsertedId 为 null.

,因此 promise 会锁定
        let promises = [];
        parent.children.forEach(child => {
            //Child contains everything except the _id
            promises.push(database.collection('Children').updateOne(
                child,
                child,
                {
                    upsert: true
                }
            ));
        });

        Promise.all(promises).then(result => {
            delete parent.children;
            parent.childIds = result.map(upsert => new ObjectId(upsert.upsertedId._id)); //ONLY THERE ON INSERT?
            database.collection('Parents').updateOne({
                parentId: obj.parentId
            }, obj, {
                upsert: true
            }).then(() => {
                //some success functionality
            }, error => {
                //some error functionality
            });
        }, error => {
            //some error functionality
        });

看来解决方案是使用 findOneAndUpdate 方法。此方法将找到一个对象,更新它,然后 return 文档。它还接受 upsert 参数,因此在找不到特定文档时执行插入。

在执行更新的情况下,结果将包含 value 字段下的文档。

在执行插入的情况下(当 upsert 为真时)字段 lastErrorObject.upserted 将被设置在结果对象中并且 value 字段将为 null

这是解决我的问题的代码:

        let promises = [];
        parent.children.forEach(child => {
            promises.push(database.collection('Children').findOneAndUpdate(
                child,
                child,
                {
                    upsert: true
                }
            ));
        });

        Promise.all(promises).then(result => {
            delete parent.children;
            parent.childrenIds = result.map(upsert => new ObjectID(upsert.lastErrorObject.upserted || upsert.value._id));
            database.collection('Parents').updateOne({
                parentId: parent.parentId
            }, obj, {
                upsert: true
            }).then(() => {
                //some success functionality
            }, error => {
                //some error functionality
            });
        }, error => {
            //some error functionality
        });