Domanda

Se ho una raccolta simile a:

[
    { "test": [ { "a": 1, "b": 2 }, { "a": 10, "b": 1 } ] },
    { "test": [ { "a": 5, "b": 1 }, { "a": 14, "b": 2 } ] },
    ...
]
.

Come posso ottenere solo un sottoinsieme di dati costituiti dai valori a quando b è 2?In SQL, questo sarebbe qualcosa di simile a:

SELECT test.a FROM collection WHERE test.b = 2
.

Capisco che posso limitare quali dati ottengo con qualcosa come:

collection.find({ }, { "test.a": 1 })
.

Ma questo restituisce tutti i valori a.Come posso limitarlo in modo che restituisca solo i valori in cui b è 2 (la parte WHERE test.b = 2 dell'equivalente SQL)?

È stato utile?

Soluzione

Puoi farlo aggiungendo un oggetto selettore come primo parametro della chiamata find e utilizzando $elemMatch operatore di proiezione:

collection.find({ 'test.b': 2 }, { test: { $elemMatch: { b: 2 } }, 'test.a': 1 })
.

Ma questo restituirà solo il primo elemento Array test per-DOC in cui b è 2. È necessario utilizzare il framework di aggregazione se ci possono essere più elementi B: 2 negli array test.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top