Я видел похожие посты в StackOverflow, но это говорит о решении, которое я уже сделал.
Вот набор данных:
Фрагмент кода:
let arrayFilters = [];
updateQuery = {};
if (value.messages && value.messages.length > 0) {
updateQuery['$set'] = {
'messages.$[el].read_receipt.receiver' : true
};
if (recipient.individual) {
arrayFilters.push({
'el.sender_party.individual': recipient.individual
});
} else {
arrayFilters.push({
'el.sender_party.shop': recipient.shop
});
}
}
console.log("Update Query",updateQuery)
console.log("Array Filter", arrayFilters)
await db.collection('chatrooms').findOneAndUpdate(filterQuery, updateQuery, {
upsert: false,
returnOriginal: false,
arrayFilters: arrayFilters,
multi: true
}).then(a => {
console.log("data",a.value)
}).catch(reason => {
console.log("reason",reason)
})
В журнале консоли я получаю следующее
Update Query { '$set': { 'messages.$[el].read_receipt.receiver': true } }
Array Filter [ { 'el.sender_party.individual': 'W3cBY1cIzJdTkbIHLwkaxGHm3dWMR0OG' } ]
Стек ошибок:
reason { MongoError: cannot use the part (messages of messages.$[el].read_receipt.receiver) to traverse the element ({messages: [ { Id: "iZ-PH7nnD", sender: "4P0qSVML32lkxuKnGcjR4acLMr2FE8q7", read_receipt: { sender: true, receiver: false }, date_added: "1573286757002", date_updated: "1573286757002", type: "text", message: "Yes, please", sender_party: { shop: "RjWDlxiookcUOopfXtqZ1okrg3mpSFdz" } }, { Id: "UjbiRgHXJ", sender: "4P0qSVML32lkxuKnGcjR4acLMr2FE8q7", read_receipt: { sender: true, receiver: false }, date_added: "1573286954329", date_updated: "1573286954329", type: "text", message: "Yes, please", sender_party: { shop: "RjWDlxiookcUOopfXtqZ1okrg3mpSFdz" } }, { Id: "Cc17qxXAm", sender: "4P0qSVML32lkxuKnGcjR4acLMr2FE8q7", read_receipt: { sender: true, receiver: false }, date_added: "1573287264379", date_updated: "1573287264379", type: "text", message: "Yes, please", sender_party: { shop: "RjWDlxiookcUOopfXtqZ1okrg3mpSFdz" } }, { Id: "qa-g6lCPp", sender: "4P0qSVML32lkxuKnGcjR4acLMr2FE8q7", read_receipt: { sender: true, receiver: false }, date_added: "1573287614845", date_updated: "1573287614846", type: "text", message: "Yes, please", sender_party: { shop: "RjWDlxiookcUOopfXtqZ1okrg3mpSFdz" } }, { Id: "U9MwvR778", sender: "4P0qSVML32lkxuKnGcjR4acLMr2FE8q7", read_receipt: { sender: true, receiver: false }, date_added: "1573287647839", date_updated: "1573287647839", type: "text", message: "Yes, please", sender_party: { shop: "RjWDlxiookcUOopfXtqZ1okrg3mpSFdz" } }, { Id: "fGrTcOYOd", sender: "4P0qSVML32lkxuKnGcjR4acLMr2FE8q7", read_receipt: { sender: true, receiver: false }, date_added: "1573287805560", date_updated: "1573287805560", type: "text", message: "Yes, please", sender_party: { shop: "RjWDlxiookcUOopfXtqZ1okrg3mpSFdz" } }, { Id: "S9ARpxrXq", sender: "4P0qSVML32lkxuKnGcjR4acLMr2FE8q7", read_receipt: { sender: true, receiver: false }, date_added: "1573287855475", date_updated: "1573287855475", type: "text", message: "Yes, please", sender_party: { shop: "RjWDlxiookcUOopfXtqZ1okrg3mpSFdz" } }, { Id: "g1mQvA82P", sender: "4P0qSVML32lkxuKnGcjR4acLMr2FE8q7", read_receipt: { sender: true, receiver: false }, date_added: "1573287964177", date_updated: "1573287964177", type: "text", message: "Yes, please", sender_party: { shop: "RjWDlxiookcUOopfXtqZ1okrg3mpSFdz" } } ]})
at Connection.<anonymous> (/Volumes/.../...-alt/Bitbucket/.../nodejs-backend/node_modules/mongodb/lib/core/connection/pool.js:466:61)
at Connection.emit (events.js:182:13)
at Connection.EventEmitter.emit (domain.js:441:20)
at processMessage (/Volumes/...-SD/...-alt/Bitbucket/.../nodejs-backend/node_modules/mongodb/lib/core/connection/connection.js:364:10)
at Socket.<anonymous> (/Volumes/...-SD/...-alt/Bitbucket/.../nodejs-backend/node_modules/mongodb/lib/core/connection/connection.js:533:15)
at Socket.emit (events.js:182:13)
at Socket.EventEmitter.emit (domain.js:441:20)
at addChunk (_stream_readable.js:287:12)
at readableAddChunk (_stream_readable.js:268:11)
at Socket.Readable.push (_stream_readable.js:223:10)
ok: 0,
errmsg:
'... displayed above ...',
code: 16837,
codeName: 'Location16837',
name: 'MongoError',
[Symbol(mongoErrorContextSymbol)]: {} }
Поле сообщения, следовательно, является массивомЯ не понимаю, почему он не может пройти. Согласно документации MongoDB $[<identifier>]
будет использоваться для массива, и то же самое может использоваться для фильтрации массива.