Мой 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
массив
Пожалуйста, предложите решение без использования карты-уменьшить
Вы не можете сделать это без некоторой клиентской логики или небольшого изменения ваших данных. Кратчайший путь к победе — получить документ по «_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"},
...
Почему вы ищете индекс фото в массиве? Возможно, есть лучший способ сделать то же самое.
Других решений пока нет …