Запрос MongoDB для поиска свойства первого элемента массива
у меня есть следующие данные в MongoDB (упрощенные для того, что необходимо для моего вопроса).
{
_id: 0,
actions: [
{
type: "insert",
data: "abc, quite possibly very very large"
}
]
}
{
_id: 1,
actions: [
{
type: "update",
data: "def"
},{
type: "delete",
data: "ghi"
}
]
}
Я хотел бы найти первый тип действия для каждого документа, например
{_id:0, first_action_type:"insert"}
{_id:1, first_action_type:"update"}
(это нормально, если данные структурированы по-разному, но мне нужны эти значения, так или иначе.)
EDIT: я пробовал db.collection.find({}, {'actions.action_type':1})
, но, очевидно, это возвращает все элементы массива действия.
NoSQL для меня совершенно новый. Раньше Я сохранили бы все это в двух таблицах в реляционной базе данных и сделали бы что-то вроде SELECT id, (SELECT type FROM action WHERE document_id = d.id ORDER BY seq LIMIT 1) action_type FROM document d
.
2 ответов
можно использовать $ slice оператор в проекции. (но для того, что вы делаете, я не уверен, что порядок массива остается прежним при его обновлении. Просто имейте в виду))
db.collection.find({},{'actions':{$slice:1},'actions.type':1})
вы также можете использовать Трубопровод Агрегации введено в версии 2.2:
db.collection.aggregate([
{ $unwind: '$actions' },
{ $group: { _id: "$_id", first_action_type: { $first: "$actions.type" } } }
])