2015-06-13 3 views
1

Примеры MongoDB записей:Mongoose лучший запрос - сортировка по двум признакам

[ 
    {first: "Some", middle: "A", last: ""}, 
    {first: "Some", middle: "B", last: ""}, 
    {first: "Some", middle: "", last: "C"}, 
    {first: "Some", middle: "D", last: ""} 
]   

Выходы:

If .sort({middle:1,last:1}) =====> C,A,B,D 
If .sort({last:1, middle:1}) =====> A,B,D,C 
If [what here ? ]   =====> A,B,C,D 
+0

Возможно ли, чтобы вы перевели свой комментарий в форме запроса –

ответ

1

Ваша проблема заключается в том, что вы пытаетесь разобраться в двух областях, используя один, если другое не пустое. Ни один простой способ не предусматривает, что он всегда сортируется по одному полю, а затем другому.

Вам нужно будет сделать это как многошаговый запрос. Сначала возьмите данные и создайте новое поле для сортировки, содержащее последний, если последнее пустое, используйте средний. Затем выполните сортировку по этому новому полю.

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

Лучшим способом было бы исправить ваши данные и никогда не сохранять с пустой фамилией. Если имя пустое, переместите среднее имя в фамилию.

1

Я нашел это решение.

db.getCollection('dummy').aggregate(
    [ 
     { $project: { merge: { $concat: [ "$middle", "$last" ] },middle: '$middle',last:'$last' } } 
    ] 
).result.sort(function(a, b) { 
    return a.merge > b.merge ? 1 : -1; 
}) 
1

Вы можете использовать aggregation framework для преобразования данных в форму, где вы можете sort это так, как вы хотите. Попробуйте агрегацию запрос:

db.yourCollection.aggregate(
    [ 
     {$project: 
      { 
       first: 1, 
       rest: {$cond: [{$eq: ['$middle', '']}, 
       '$last', '$middle']}, 
       isMiddle: {$cond: [{$eq: ['$middle', '']}, false, true]} 
      } 
     }, 
     {$sort: {rest: 1}}, 
     {$project: 
      { 
       first: 1, 
       middle: {$cond: ['$isMiddle', '$rest', '']}, 
       last: {$cond: ['$isMiddle', '', '$rest']} 
      } 
     } 
    ] 
) 

Это поможет вам, что вы хотите:

{ "first" : "Some", "middle" : "A", "last" : "" } 
{ "first" : "Some", "middle" : "B", "last" : "" } 
{ "first" : "Some", "middle" : "", "last" : "C" } 
{ "first" : "Some", "middle" : "D", "last" : "" } 

Проблема с обычной сортировкой, что middle и last отдельные ключи и сортируется самостоятельно (хотя стабильно). Таким образом, единственный способ достичь вашей цели - объединить их в один ключ.

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