Jsem fanoušek webový programátor, který se právě začal učit MongoDB/Mongoose a nemůžu přijít na to, jak připojit k řetězci umístěnému v hlubokém vnořeném poli. Snažím se připojit řetězec na konec hours: String
. Níže je schéma, se kterým pracuji:
const TestSchema = new Schema({ userID: Number, years: [ { year: Number, months: [{ month: Number, days: [{ day: Number, hours: String }] }] } ] });
Tady je to, co zatím mám. Pokusil jsem se rozšířit tuto odpověď zde:https://stackoverflow.com/a/56589089. Ale toto mi dává Cannot specify arrayFilters and a pipeline update
chyba.
TestModel.findOneAndUpdate( { "years.months.days.day": 12 }, [ { $set: { "years.$[index1].months.$[index2].days.$[index3].hours": { $concat: [ "$years.$[index1].months.$[index2].days.$[index3].hours", " 44:44:44" ] } } } ], { arrayFilters: [ { "index1.year": 2020 }, { "index2.month": 7 }, { "index3.day": 12 } ] } ).catch(error => { console.log("error>>" + error); });
Edit:Níže je kód, pomocí kterého jsem vytvořil instanci modelu
var test = new TestModel({ userID: 5, years: [{ year: 2020, months: [{ month: 7, days: [{ day: 12, hours: "4:4:4 5:5:5" }] }] }] }) test.save().then(function(){ console .log("testSaved>>" + !test.isNew); });
Zde je snímek obrazovky dat v db:Velmi oceníme jakoukoli pomoc.
Odpověď
Aktualizace nepodporuje obě operace společně „arrayFilters“ a „agregační kanál“, musíte použít pouze jednu operaci z obou,
Zde tedy musíte použít pouze agregační kanál aktualizací pomocí vnořených $map
,
TestModel.findOneAndUpdate({ years: { $elemMatch: { year: 2020, months: { $elemMatch: { month: 7, days: { $elemMatch: { day: 12 } } } } } } }, [{ $set: { years: { $map: { input: "$years", as: "y", in: { $mergeObjects: [ "$$y", { months: { $map: { input: "$$y.months", as: "m", in: { $mergeObjects: [ "$$m", { days: { $map: { input: "$$m.days", as: "d", in: { $mergeObjects: [ "$$d", { hours: { $cond: { if: { $and: [ { $eq: ["$$y.year", 2020] }, { $eq: ["$$m.month", 7] }, { $eq: ["$$d.day", 12] } ] }, then: { $concat: ["$$d.hours", " 44:44:44"] }, else: "$$d.hours" } } } ] } } } } ] } } } } ] } } } } }] )