2013-04-17 1 views
0

Рассмотрим следующий документ в коллекции с именемКак построить запрос для привязки поля родительского документа к полю документа встроенного массива. Использование MongoDB агрегации Операторы

{ 
    "_id" : "MY_ID", 
    "ThisCityID" : "001", 
    "CityIDs" : [{ 
     "CityID" : "001", 
     "CityName" : "Bangalore" 
    }, { 
     "CityID" : "002", 
     "CityName" : "Mysore" 
    }], 
    "CityUserDetails": { 
     "User" : "ABCD" 
    } 
} 

Теперь я User значение, то есть в приведенном выше случае у меня есть значение ABCD и хотите найти его единственный город, где поле первого уровня в «CityAssociation» ThisCityID соответствует полям встроенного массива documnet CityID. Наконец мне нужно проецировать следующим образом (для вышеприведенного случая):

{ 
'UserName': 'ABCD', 
'HomeTown':'Bangalore' 
} 

В Node.js + MongoDB родной диск, я написал запрос агрегирования следующим образом, который не работает, как ожидалось.

collection.aggregate([ 
{ $match: { 'CityUserDetails.User': 'ABCD', 'CityIDs': { $elemMatch: { CityID: ThisCityID}}} }, 
{ $unwind: "$CityIDs" }, 
{ $group: { 
    _id: '$_id', 
    CityUserDetails: { $first: "$CityUserDetails" }, 
    CityIDs: { $first: "$CityIDs" } 
    } 
}, 
    { $project: { 
     _id: 0, 
     "UserName": "$CityUserDetails.User", 
     "HomeTown": "$CityIDs.CityName" 
     } 
    } 
    ], function (err, doc) { 
     if (err) return console.error(err); 
     console.dir(doc); 
    } 
); 

Может ли кто-нибудь сказать мне, как это можно сделать с помощью запроса.

Примечание: На схеме MongoDB у нас нет контроля, чтобы изменить его.

ответ

1

Вы можете использовать оператор $eq, чтобы проверить, соответствует ли поле первого уровня ThisCityID полям встроенного массива CityID.

db.city.aggregate([ 
    { $match : { "CityUserDetails.User" : "ABCD" }}, 
    { $unwind : "$CityIDs" }, 
    { $project : { 
     matches : { $eq: ["$CityIDs.CityID","$ThisCityID"]}, 
     UserName : "$CityUserDetails.User", 
     HomeTown : "$CityIDs.CityName" 
    }}, 
    { $match : { matches : true }}, 
    { $project : { 
     _id : 0, 
     UserName : 1, 
     HomeTown : 1 
    }}, 
]) 

И результат:

{ 
    "result" : [ 
     { 
      "UserName" : "ABCD", 
      "HomeTown" : "Bangalore" 
     } 
    ], 
    "ok" : 1 
} 
+0

очень красиво ... спасибо это работает ... –