2015-04-08 2 views
1

Я пытаюсь разобраться в этом в MongoDB с mongojs на find():Как многоуровневая запись MongoDB с динамическими клавишами, на двух подпозициях?

{ 
    "songs": { 
     "bNppHOYIgRE": { 
      "id": "bNppHOYIgRE", 
      "title": "Kygo - ID (Ultra Music Festival Anthem)", 
      "votes": 1, 
      "added": 1428514707, 
      "guids": [ 
       "MzM3NTUx" 
      ] 
     }, 
     "izJzdDPH9yw": { 
      "id": "izJzdDPH9yw", 
      "title": "Benjamin Francis Leftwich - Atlas Hands (Samuraii Edit)", 
      "votes": 1, 
      "added": 1428514740, 
      "guids": [ 
       "MzM3NTUx" 
      ] 
     }, 
     "Yifz3X_i-F8": { 
      "id": "Yifz3X_i-F8", 
      "title": "M83 - Wait (Kygo Remix)", 
      "votes": 0, 
      "added": 1428494338, 
      "guids": [] 
     }, 
     "nDopn_p2wk4": { 
      "id": "nDopn_p2wk4", 
      "title": "Syn Cole - Miami 82 (Kygo Remix)", 
      "votes": 0, 
      "added": 1428494993, 
      "guids": [] 
     } 
    } 
} 

, и я хочу, чтобы отсортировать ключи в песнях на votes восходящей и нисходящей added.

Я попытался

db.collection(coll).find().sort({votes:1}, function(err, docs) {}); 

, но это не работает.

+1

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

ответ

1

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

db.coll.aggregate([{ "$unwind": "$songs" }, { "$sort": { "songs.votes": 1, "songs.added": -1 }}]); 

И если вы поставите каждого из этих песен в отдельном songs коллекции, то вы могли бы выполнить запрос с помощью простого find() и sort().

db.songs.find().sort({ "votes": 1, "added": -1 }); 

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

Возможно, но излишне сложно. И, конечно же, вы не сможете воспользоваться индексами, которые повлияют на вашу производительность.

Внутри документа вы уже включили key, поэтому я действительно рекомендую вам пересмотреть свою схему.

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