Группировка MongoDB возвращает только один документ, даже если он совпадает со многими документами? - PullRequest
0 голосов
/ 07 декабря 2011

Я тестирую функцию группировки в mongodb.

Групповая функция принимает объект в качестве аргумента.Внутри объекта у них есть ключ с именем cond, значение которого можно использовать в качестве запроса для сопоставления документов.

Я передаю правильный запрос, который соответствует нескольким документам.Но группировка возвращает только последний найденный документ.Я думаю, что мне здесь чего-то не хватает, чтобы функция group возвращала все результаты сопоставленных документов.

Я выполнил следующие шаги:

db.test.insert({user:{name:"xxxx1"}});
db.test.insert({user:{name:"xxxx2"}});
db.test.insert({user:{name:"xxxx3"}});
db.test.insert({user:{name:"xxxx4"}});
db.test.insert({user:{name:"xxxx5"}});
db.test.insert({user:{name:"xxxx6"}});


db.test.group({
    initial:{name:'', id:''}, 
    reduce:function(d, o){o.name = d.user.name; o.id=d._id;}, 
    finalize:function(o){}, 
    cond:{"user.name":/^x/}
    });

Приведенная выше команда возвращает

[ 
  {  
    "name" : "xxxx6", "id" : ObjectId("4edf72baec65faac52976e72") 
  } 
]

Это последний вставленный документ.

Что мне сделать, чтобы получить все подходящие результаты!?

Спасибо

1 Ответ

1 голос
/ 07 декабря 2011

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

Просто сделайте db.collection.find(query-document), что в вашем случае будет:

db.test.find({"user.name": /^x/})

Обновление для получения новой информации:

"Я не хочу отправлять полный документ"

Затем используйте второй параметр find, чтобы предоставить документ с полями, которые вы хотите { "user.name": 1 }. Помните, что _id включен по умолчанию, но вы можете исключить его, если хотите использовать {_id: 0}.

Что касается форматирования, если важно сохранить порядок, используйте массив. Если заказ не имеет значения, и это для демонстрации, сделайте заказ только на стороне клиента. Использование map lower для форматирования выходных данных не предназначено для использования и будет только замедлять запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...