2013-03-08 2 views
0

Я ищу для сортировки результатов на основе совпадений полей. Учитывая У меня есть коллекция с документами вроде этого:mongodb сортировать по совпадению в поле

{ 
    "foo": "orange", 
    "bar": "apple", 
    "baz": "pear", 
} 

{ 
    "foo": "kiwi", 
    "bar": "orange", 
    "baz": "banana", 
} 

Как сортировать результат для документов, соответствующих «оранжевых» в любом Foo, бар, или Баз полем, в котором они совпадают, то есть все документы, соответствующие на поле foo должно появиться в результате перед документами в панели полей и т. д.?

Спасибо!

ответ

0

Try ниже запроса:

db.test.find({$or:[{'foo':"orange"},{'bar':"orange"}]}).sort({'foo':-1,'bar':-1}) 
+0

Является ли это работает для вас? – Sach

0

Вы хотите список документов, в следующем порядке:

  • где Foo = "оранжевый"
  • где бар = "оранжевый"
  • где baz = "orange"

Thi s не может быть выполнено с помощью команды find(). sort(), потому что нет способа сортировать по ключу (имени) поля только по его содержимому.

Можно, однако, с агрегатом():

> db.xx.find() 
{ "_id" : 1, "bar" : "apple", "baz" : "pear", "foo" : "orange" } 
{ "_id" : 2, "foo" : "banana", "bar" : "apple", "baz" : "orange" } 
{ "_id" : 3, "foo" : "banana", "bar" : "orange", "baz" : "pear" } 
{ "_id" : 4, "foo" : "banana", "bar" : "apple", "baz" : "pear" } 
{ "_id" : 5, "foo" : "orange", "bar" : "apple", "baz" : "pear" } 
>  db.xx.aggregate([ 
...   { $match: { $or: [ { foo: "orange" }, { bar: "orange" }, { baz: "orange" } ] } }, 
...   { $project: { "_id": 1, 
...      "which": { "$cond": [{ "$eq": [ "$foo", "orange" ]}, "01foo", 
...        { "$cond": [{ "$eq": [ "$bar", "orange" ]}, "02bar", "03baz" ] } 
...      ] } 
...   } }, 
...   { $group: { _id: { which: "$which", _id: "$_id" } } },   
...   { $sort: { "_id.which": 1, "_id._id": 1 } }, 
...   { $project: { which: { $substr: ["$_id.which", 2, -1] }, _id: "$_id._id" } },   
...  ]); 
{ 
    "result" : [ 
     { 
      "_id" : 1, 
      "which" : "foo" 
     }, 
     { 
      "_id" : 5, 
      "which" : "foo" 
     }, 
     { 
      "_id" : 3, 
      "which" : "bar" 
     }, 
     { 
      "_id" : 2, 
      "which" : "baz" 
     } 
    ], 
    "ok" : 1 
} 

Вы правы, если вы считаете, что агрегат является слишком сложным. Было бы проще, если ваши данные были организованы по-разному, что-то вроде

{ type: "foo", value: "orange" } 

и имеют имена типа сортировки - как «Ba1», «Ba2», «Ba3» вместо «Foo», «бар»,» Баз»

для получения дополнительной информации о совокупности, см http://docs.mongodb.org/manual/reference/aggregation и http://docs.mongodb.org/manual/tutorial/aggregation-examples/

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