我一直在寻找一种基于嵌入式文档ID来向上插入嵌入式文档的方法。到目前为止,每种方法都需要对DB进行两次单独的调用才能使其正常工作。这是一个示例文档(sku包含更多信息,但为了简洁起见,我将其保留)。
{
id: 12335,
skus: [{id:239032489230}, {id:kd893dsands}]
}
这是我发现的更好的方法之一,因为如果存在,它不会打第二个电话。有没有办法在一次调用mongodb中做到这一点(如果存在或不存在)?
{id: 12335} //example query
{id:239032489230, name: "Large"} //example sku
module.exports.upsertSku = function (query, sku) {
return new Promise((resolve, reject) => {
Product.findOneAndUpdate(query, {
$set: {
"skus.$[elem]": sku
}
},
{
arrayFilters: [ { "elem.id": sku.id } ],
upsert: true, //does not upsert into the array :(
new: true
})
.exec()
.then((product) => {
if (product.skus.some(docSku => docSku.id === sku.id)) { //checks if the id of the object passed exists in the skus array.
console.log("Sku exists and has been updated.")
resolve(product)
}else{
console.log("Sku does not exist. Adding sku...")
addSku()
}
}).catch((err) => {
reject(err);
})
function addSku() {
Product.findOneAndUpdate(query, {
$push: {"skus": sku}
},
{new: true})
.exec()
.then((product) => {
resolve(product);
}).catch((err) => {
reject(err);
})
}
});
};