Запрос 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" } } }
])