2016-07-13 3 views
1

У меня есть коллекция под названием «formTest123» со следующими записями:Монго DB Сортировка проблемы с возрастающим порядком

 /* 0 */ 
{ 
    "_id" : ObjectId("5784f5aeef31a98294231459"), 
    "data" : [ 
     { 
      "name" : "Amir", 
      "Other" : [ 
       { 
        "data" : { 
         "city" : { 
          "address" : "pncjj" 
         } 
        } 
       }, 
       { 
        "data" : { 
         "state" : { 
          "address" : "xyz" 
         } 
        } 
       } 
      ] 
     } 
    ] 
} 

/* 1 */ 
{ 
    "_id" : ObjectId("5784f62cef31a9829423145a"), 
    "data" : [ 
     { 
      "name" : "Zssmir", 
      "Other" : [ 
       { 
        "data" : { 
         "city" : { 
          "address" : "bncd" 
         } 
        } 
       }, 
       { 
        "data" : { 
         "state" : { 
          "address" : "gyk" 
         } 
        } 
       } 
      ] 
     } 
    ] 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("5784f636ef31a9829423145b"), 
    "data" : [ 
     { 
      "name" : "Cmir", 
      "Other" : [ 
       { 
        "data" : { 
         "city" : { 
          "address" : "tuhn" 
         } 
        } 
       }, 
       { 
        "data" : { 
         "state" : { 
          "address" : "knm" 
         } 
        } 
       } 
      ] 
     } 
    ] 
} 

Когда я запрашиваю эту коллекцию:

db.formTest123.find().sort({ "data.Other.data.city.address" : -1}) 

средство в порядке убывания его дает правильный результат:

/* 0 */ 
{ 
    "_id" : ObjectId("5784f636ef31a9829423145b"), 
    "data" : [ 
     { 
      "name" : "Cmir", 
      "Other" : [ 
       { 
        "data" : { 
         "city" : { 
          "address" : "tuhn" 
         } 
        } 
       }, 
       { 
        "data" : { 
         "state" : { 
          "address" : "knm" 
         } 
        } 
       } 
      ] 
     } 
    ] 
} 

/* 1 */ 
{ 
    "_id" : ObjectId("5784f5aeef31a98294231459"), 
    "data" : [ 
     { 
      "name" : "Amir", 
      "Other" : [ 
       { 
        "data" : { 
         "city" : { 
          "address" : "pncjj" 
         } 
        } 
       }, 
       { 
        "data" : { 
         "state" : { 
          "address" : "xyz" 
         } 
        } 
       } 
      ] 
     } 
    ] 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("5784f62cef31a9829423145a"), 
    "data" : [ 
     { 
      "name" : "Zssmir", 
      "Other" : [ 
       { 
        "data" : { 
         "city" : { 
          "address" : "bncd" 
         } 
        } 
       }, 
       { 
        "data" : { 
         "state" : { 
          "address" : "gyk" 
         } 
        } 
       } 
      ] 
     } 
    ] 
} 

Бу т Когда я запрос с:

db.formTest123.find().sort({ "data.Other.data.city.address" : 1}) 

получить в порядке возрастания «city.address» это дает:

/* 0 */ 
    { 
    "_id" : ObjectId("5784f5aeef31a98294231459"), 
    "data" : [ 
     { 
      "name" : "Amir", 
      "Other" : [ 
       { 
        "data" : { 
         "city" : { 
          "address" : "pncjj" 
         } 
        } 
       }, 
       { 
        "data" : { 
         "state" : { 
          "address" : "xyz" 
         } 
        } 
       } 
      ] 
     } 
    ] 
} 

/* 1 */ 
{ 
    "_id" : ObjectId("5784f62cef31a9829423145a"), 
    "data" : [ 
     { 
      "name" : "Zssmir", 
      "Other" : [ 
       { 
        "data" : { 
         "city" : { 
          "address" : "bncd" 
         } 
        } 
       }, 
       { 
        "data" : { 
         "state" : { 
          "address" : "gyk" 
         } 
        } 
       } 
      ] 
     } 
    ] 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("5784f636ef31a9829423145b"), 
    "data" : [ 
     { 
      "name" : "Cmir", 
      "Other" : [ 
       { 
        "data" : { 
         "city" : { 
          "address" : "tuhn" 
         } 
        } 
       }, 
       { 
        "data" : { 
         "state" : { 
          "address" : "knm" 
         } 
        } 
       } 
      ] 
     } 
    ] 
} 

Это явно не так, как сейчас записи не сортируются в порядке возрастания «city.address»

Может ли кто-нибудь угадать, что является проблемой с восходящим порядком?

ответ

0

Это потому, что он заказывает от «самого низкого» до «самого высокого».

Проблема в том, что неопределенное и/или нулевое значение имеет «нижнее» значение, чем любое существующее число.

При заказе массивом он ищет все документы в этом массиве и принимает минимальное значение, которое «неопределено» в документе, которое содержит состояние.

Если вы, например, добавьте «city.address» с достаточно высоким значением для всех ваших документов, он будет работать для восхождения. Как это:

 "Other" : [ 
      { 
       "data" : { 
        "city" : { 
         "address" : "tuhn" 
        } 
       } 
      }, 
      { 
       "data" : { 
        "state" : { 
         "address" : "knm" 
        } 
        "city" : { 
         "address" : "zzzzzzzzzzzzzzzzz" 
        } 
       } 
      } 
     ] 

Примечание: Для нисхождения он принимает максимальное значение, поэтому она «работает», потому что любое city.address переопределить все нуль и неопределенными.

Если вам нужно по возрастанию и не хотите изменять структуру данных, я бы предложил заказать его по убыванию, а затем обратный порядок программно, если это возможно.

0

Поскольку поле «Другое» представляет собой массив (под) документов, мы должны указать индекс поддокумента. Основываясь на схеме, указанной в вопросе, выполните следующие работы.

db.formTest123.find().sort({ "data.Other.0.data.city.address" : 1}); 

и

db.formTest123.find().sort({ "data.Other.0.data.city.address" : -1}); 
Смежные вопросы