MongoDB находит ключ по значению во вложенном массиве

Мой mongodb документ

    {
_id:'ghuvt6GYrs6Hhgts6uhg',
photos:[
{
"photoId":"1322",
"title":"Life is beautiful",
"score":"1331322"},
{
"photoId":"1323",
"title":"Very Cute Dog",
"score":"1231726"},
{
"photoId":"1324",
"title":"Funny Cat",
"score":"1246556"},
{
...
...
...
}
.
.
.
.
.
]
}

Чего я хочу достичь, так это получить внутри массива photos массив где photoId:"1323"
Я могу добиться этого в PHP с

$doc_test = $collection_images->findone(
array("_id" => new MongoId('ghuvt6GYrs6Hhgts6uhg')),
array("photos" =>
array(
'$elemMatch' => array(
"photoId" => "1323")
)
)
);

И по результату будет выглядеть как [JSON]

   {
"photoId":"1323",
"title":"Very Cute Dog",
"score":"1231726"}

Но я хочу, чтобы значение ключа (индекса) соответствовало подмассиву, как это было бы 1 потому что этот под-массив является вторым сверху в photos массив

Пожалуйста, предложите решение без использования карты-уменьшить

0

Решение

Вы не можете сделать это без некоторой клиентской логики или небольшого изменения ваших данных. Кратчайший путь к победе — получить документ по «_id»:

> var doc = db.images.findOne({ "_id" : "ghuvt6GYrs6Hhgts6uhg" })

а затем сканировать массив для photoId чтобы получить индекс «1323»

> var spot = -1
> for (var i = 0; i < doc.photos.length; i++) { if (doc.photos[i].photoId === "1323") spot = i }

Вы также можете просто пометить документы массива их позицией:

{
_id:'ghuvt6GYrs6Hhgts6uhg',
photos:[
{
"spot" : 0,
"photoId":"1322",
"title":"Life is beautiful",
"score":"1331322"},
{
"spot" : 1,
"photoId":"1323",
"title":"Very Cute Dog",
"score":"1231726"},
...

Почему вы ищете индекс фото в массиве? Возможно, есть лучший способ сделать то же самое.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]