mongodb сортировать по совпадению в поле
Я смотрю, чтобы отсортировать результаты на основе того, в каком поле соответствует. Учитывая, что у меня есть коллекция с такими документами:
{
"foo": "orange",
"bar": "apple",
"baz": "pear",
}
{
"foo": "kiwi",
"bar": "orange",
"baz": "banana",
}
Как можно отсортировать результат для документов, соответствующих "оранжевому" в foo, bar или baz, по полю, в котором они совпадают, т.е. все документы, соответствующие по полю foo, должны отображаться в результате перед документами в строке поля и т. Д.?
Спасибо!
2 ответа
Вы хотите список документов в следующем порядке:
- где foo = "апельсин"
- где бар = "оранжевый"
- где баз = "апельсин"
Это невозможно сделать с помощью одной команды 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","bar","baz"
Для получения дополнительной информации о совокупности см. http://docs.mongodb.org/manual/reference/aggregation и http://docs.mongodb.org/manual/tutorial/aggregation-examples/
Попробуйте ниже запрос:
db.test.find({$or:[{'foo':"orange"},{'bar':"orange"}]}).sort({'foo':-1,'bar':-1})