2016-02-02 2 views
2

Исследовательские работы должны быть отсортированы по фамилии автора. Это как JSON выглядит с одним автором:Метеор: как сортировать документы по первому элементу массива

{ 
    "_id" : "ADnijjRpoWkTEGgkc", 
    "authors" : [ 
     { 
      "lastName" : "Rahbaran", 
      "firstName" : "Amir" 
     } 
    ], 
    "title" : "Bricolage revisted", 
    "outlet" : "Journal of Strategic Management", 
    "year" : "2017", 
    "abstract" : "dicta sunt explicabo. Nemo enim ..." 
} 

Соответствующий вспомогательный шаблон отлично работает, если есть только один автор хранится:

return Publications.find({}, { 
     sort: {"authors.lastName": -1} 
    }).fetch(); 

Проблема: Во многих случаях, у вас есть несколько авторы для одной исследовательской работы:

Это будет JSON:

{ 
    "_id" : ObjectId("56b06047204a563ca4207e8e"), 
    "authors" : [ 
     { 
      "lastName" : "Lennon", 
      "firstName" : "John" 
     }, 
     { 
      "lastName" : "McCartney", 
      "firstName" : "Paul" 
     } 
    ], 
    "title" : "The Beatles - revisted", 
    "outlet" : "Journal of Great Music", 
    "year" : "1968", 
    "abstract" : "Ob-La-Di, Ob-La-Da ... " 
} 

Теперь я пробовал sort: {"authors.lastName.0": -1} или sort: {"authors.lastName[0]": -1} безрезультатно.

Я пришел с концепциями карты, уменьшил и заполнил, но не знал, как подать заявку здесь, и если это необходимо, соответственно.

Возможно, у Метеор есть пакет или «трюк» для этого?

Любая помощь действительно ценится.

ответ

1

Предполагая, что у вас всегда есть по крайней мере один автор, вы можете сделать следующее:

Publications.find({}, { 
    sort: { 
    'authors.0.lastName': -1 
    } 
}); 
+0

Это сделал трек, ТНХ! :) Только небольшая проблема: он вроде как: 1-й: Dada Zetty AND Amir Aaron 2nd: Dada Zetty. Было бы лучше, если бы документ с одним автором был показан первым. Есть идеи? –

1
db.publications.find({}).sort({"authors.lastName":-1}) 

отлично работает. Он сортирует массив authors внутри документа, выбирает первый элемент, а затем сортирует документы. Documentation.

+0

Он делает это, но сначала сортирует документы с несколькими авторами, затем с двумя авторами, затем с одним автором. –

+1

Просто, чтобы уточнить, это происходит только для документов, имеющих одного и того же «самого большого» автора. Вероятно, вам нужно добавить это требование «вторичной сортировки» к вопросу, но я боюсь, что агрегация - единственный способ добиться этого. –

1

Другой вариант использования aggregation framework с помощью метода aggregate(), вы можете отсортировать массив авторов, а также документы. Хотя aggregate() еще не поддерживается в метеоритах, вам нужно установить пакет инфраструктуры агрегации - он не делает ничего, чтобы представить себя, просто обертывает для вас некоторые монгольские методы.

Только метеор добавить meteorhacks:aggregate и вы должны быть в бизнесе. Это добавит правильную поддержку агрегации для Meteor.

Теперь вам нужно будет запустить этот трубопровод, чтобы достичь желаемого результата:

var pipeline = [ 
    { "$unwind": "authors" }, 
    { "$sort": { "authors.lastName": -1 } }, 
    { 
     "$group": { 
      "_id": "$authors", 
      "authors": { "$push": "$authors" }, 
      "title": { "$first": "$title" }, 
      "outlet": { "$first": "$outlet" }, 
      "year": { "$first": "$year" }, 
      "abstract": { "$first": "$abstract" } 
     } 
    }, 
    { "$sort": { "authors.lastName": -1 } }, 
]; 

return Publications.aggregate(pipeline); 
+0

выглядит великолепно, но слишком сложно для меня :(может быть, через несколько месяцев. Есть ли какая-нибудь польза, чтобы это сделать, а не с помощью @corvid? –

Смежные вопросы