Estoy tratando de lograr lo siguiente en mangosta:
Digamos que tengo la siguiente colección.
{ "_id": { "$oid": "111" }, "email": "xxx@mail.com", "givenName": "xxx", "familyName": "xxx", "favoriteProducts": [{ "soldTo": "33040404", "skus": ["W0541", "W2402"] }, { "soldTo": "1223", "skus": ["12334"] }] }
quiero poder agregar un sku a la matriz de productos favoritos en función de soldTo y _id. Al hacer esto hay dos escenarios posibles.
una. Ya hay un objeto en los productos favoritos con el objeto vendido a, en cuyo caso el sku simplemente se agrega a la matriz (por ejemplo, agregue el sku '12300' a vendido a '1223' para el id '111')
b. Todavía no hay ningún objeto con el objeto vendido a, en cuyo caso este objeto debe crearse con el sku y el objeto vendido dados. (por ejemplo, agregue sku '123' a soldTo '321' para id '111')
hasta ahora he hecho esto, pero siento que hay una manera de hacerlo en una sola consulta.
private async test() { const soldTo = '1223'; const sku = '12300'; const id = '111'; const hasFavoriteForSoldTo = await userModel.exists({ _id: id, 'favoriteProducts.soldTo': soldTo, }); if (!hasFavoriteForSoldTo) { await userModel .updateOne( { _id: id, }, { $addToSet: { favoriteProducts: { skus: [sku], soldTo } } }, ) .exec(); } else { await userModel .updateOne( { _id: id, 'favoriteProducts.soldTo': soldTo, }, { $addToSet: { 'favoriteProducts.$.skus': sku } } ) .exec(); } }
Usar actualizar-documentos-con-canalización-de-agregación
Echa un vistazo a la zona de juegos de mongo a continuación. No estoy seguro de querer la Salida 1 o la Salida 2 .
Salida 1
db.collection.update({ _id: { "$oid": "111222333444555666777888" } }, [ { $set: { favoriteProducts: { $cond: { if: { $in: [ "1223", "$favoriteProducts.soldTo" ] }, then: { $map: { input: "$favoriteProducts", as: "f", in: { $cond: { if: { $eq: [ "1223", "$$f.soldTo" ] }, then: { $mergeObjects: [ "$$f", { skus: [ "12300" ] } ] }, else: "$$f" } } } }, else: { $concatArrays: [ "$favoriteProducts", [ { skus: [ "12300" ], soldTo: "1223" } ] ] } } } } } ], { multi: true })
Salida 2
db.collection.update({ _id: { "$oid": "111222333444555666777888" } }, [ { $set: { favoriteProducts: { $cond: { if: { $in: [ "1223", "$favoriteProducts.soldTo" ] }, then: { $map: { input: "$favoriteProducts", as: "f", in: { $cond: { if: { $eq: [ "1223", "$$f.soldTo" ] }, then: { $mergeObjects: [ "$$f", { skus: { $concatArrays: [ [ "12300" ], "$$f.skus" ] } } ] }, else: "$$f" } } } }, else: { $concatArrays: [ "$favoriteProducts", [ { skus: [ "12300" ], soldTo: "1223" } ] ] } } } } } ], { multi: true })