2015-09-11 3 views
1

У меня есть структура документа, как, что:MongoDB: OrderBy конкретного поля в массиве

{ 
    "_id": ObjectId("4ed3733abde68a21780000a0"), 
    [HERE OTHER DATA...] 
    "myArray": [ 
    { 
     "name": "myName1", 
     "value": 4 
    }, 
    { 
     "name": "myName2", 
     "value": "myValue" 
    }, 
    { 
     "name": "myName3", 
     "value": 14.6 
    } 
    ] 
} 

Я хочу сделать запрос документов по заказу конкретного поля в массиве «туАггау».

Пример: Я хочу, чтобы запросить документы, заказанные MyArray [имя = «myname1»] значение

Если туАггау [имя = «myname1»] не существует, она должна быть в конце результата. список.

Если myArray [name = "myName1"] существует два раза в документе, возможно, возьмите первый.

Возможно ли это?

ответ

3

Вы можете возможно упорядочить по массиву «индекс» обычно с рода:

db.collection.find().sort({ "myArray.0.value": 1 }) 

Но если вы действительно хотите отсортировать по «имени» согласования, то вам нужно будет делать это вместо:

db.collection.aggregate([ 
    { "$project": { 
     "field": 1, 
     "anotherField": 1, 
     "myArray": 1, 
     "sortField": { 
      "$setDifference": [ 
       { "$map": { 
        "input": "$myArray", 
        "as": "el", 
        "in": { 
         "$cond": [ 
          { "$eq": [ "$$el.name", "myName1" ] }, 
          "$$el.value", 
          false 
         ] 
        } 
       }}, 
       [false] 
      ] 
     } 
    }}, 
    { "$sort": { "sortField": 1 } } 
]) 

который по существу «отфильтровывает» значение поля вы хотите использовать, где это соответствует, а затем допускает, что новое прогнозируемое поле (до сих пор на самом деле массив, хотя один элемент, или, может быть, ни один), который будет использоваться для сортировки по ,

Также см. $project и other aggregation operators для их использования.

Обратите внимание, что если ваше «имя», которое должно быть согласовано, не существует в массиве, результаты могут быть не такими, какие вы хотите.

Но вы не можете «просто указать имя» для соответствия непосредственно .sort(), так как он просто не работает таким образом. Следовательно, более длинная конструкция, чтобы это произошло.