Sto guardando la documentazione di MongoDB sulle proiezioni $
e $elemMatch
. Sto cercando di capire come restituire solo un sottoinsieme dei campi di un array di proiezione , ma non riesco a capirlo.Restituisce solo campi specifici dal sottodocumento di array di proiezione
Related posts:
Io non sto cercando di eseguire un $slice da mongodb aggregation framework - Fetch first document's field of the nested array.
Né sto cercando di appiattire il sottodocumento da Return only array value in mongo projection perché desidero ancora alcuni campi dal documento principale.
Dire che ho i seguenti documenti della collezione test
:
{
"_id": "A",
"array": [
{"key": 1, "name": "foo", "data": {}},
{"key": 2, "name": "bar", "data": {}}
],
"extra": {}
},
{
"_id": "B",
"array": [
{"key": 3, "name": "spam", "data": {}},
{"key": 4, "name": "eggs", "data": {}}
],
"extra": {}
}
La query che effettivamente voglio compiere è:
db.test.findOne({"array.key": 1}, {"array.$.name": 1, "extra": 1})
che uno si aspetterebbe che per restituire solo name
sotto il sub-documento nell'array dove key
era 1
. Ad esempio,
{
"_id": "A",
"array": [
{"name": "foo"}
],
"extra": {}
}
Ma se mi esibisco quella query, ottengo questo invece:
{
"_id": "A",
"array": [
{"key": 1, "name": "foo", "data": {}}
],
"extra": {}
}
che è identico a fare la query:
db.test.findOne({"array.key": 1}, {"array.$": 1, "extra": 1})
Ho anche provato il seguente che risulta nello stesso:
db.test.findOne({"array.key": 1}, {"array.$": 1, "array.name": 1, "extra": 1})
Esiste un modo per restituire solo un sottoinsieme dei campi per array.$
anziché l'intero sotto-documento?
Non sapevo che l'aggregazione potesse realizzare ciò che stavo cercando di fare perché non sto aggregando più documenti. – cpburnz
Ma cosa succede se non è possibile utilizzare gli aggregati? Sono un po 'confuso su questo, dato che puoi usare l'operatore $ e accedere a un sottocampo in un aggiornamento come questo: 'db.students.update ( {_id: 4," grades.grade ": 85}, {$ set: {"voti. $. std": 6}} ) ' – Bilk