获取更新文档的 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
});
我正在尝试使用 upsert 更新父文档及其所有子文档 ID 的数组。问题是只有在更新插入导致插入发生时才会返回 ID。
我有以下代码,在插入新子项时可以使用,但是一旦更新一个子项,由于结果的 upsertedId 为 null
.
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
});