2011-01-30 3 views
1

У меня есть коллекции, как это:MongoDB запрос предельных значений на основе условия

{ "_id" : ObjectId("4d45bd25957a15b80702d4e4"), "codenum" : 10, "payment" : [ 
{ 
    "pcode" : 100, 
    "amount" : 10000 
}, 
{ 
    "pcode" : 101, 
    "amount" : 6000 
} 
], "age" : 70 } 

Обратите внимание, что массив оплаты встраивается в этой коллекции. Теперь я хотел бы получить только код оплаты, соответствующий 101 в ответе на поиск.

Давая запрос так:

db.test.find({"codenum":10, "payment.pcode": 101}, 
      {"codenum":1, "payment.pcode":1, "payment.amount":1}) 

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

Однако Я требую ответа что-то вроде этого:

{ "_id" : ObjectId("4d45bd25957a15b80702d4e4"), "codenum" : 10, "payment" : [ 
{ 
    "pcode" : 101, 
    "amount" : 6000 
} 
] } 

возможно ли это в MongoDB?

В обновлении() имеется позиционное совпадение, которое можно использовать как «платеж. $. Amount», чтобы установить соответствующее поле на основе условия.

Может быть MongoDB может поддерживать запрос, как это:

db.test.find({"codenum":10, "payment.pcode": 101}, 
      {"payment.$.pcode": 1, "payment.$.amount":1}) 

, которые затем дают только те записи, которые соответствуют условию заданного.

Любые мысли?

ответ

1

Насколько я знаю, невозможно выбрать только одну запись из массива в MongoDB. Вы можете вернуть только определенные поля из документа (т. Е. Ваш массив платежей), но вы не можете вернуть только часть массива на основе запроса. (Вы можете использовать $slice для возврата определенного элемента с разделителями индексов, но это не дает вам то, что вам нужно здесь).

Вы должны запросить либо все поле, либо ничего. This JIRA ticket описывает проблему, и в настоящее время она «запланирована, но не запланирована».

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

+0

спасибо. Когда я просматривал, я заметил, что http://jira.mongodb.org/browse/SERVER-828 - это именно то, что я имел в виду. Будем надеяться, что виртуальная коллекция (СЕРВЕР-142, указанный вами билет JIRA) будет доступна в ближайшее время. Я приму свой ответ. – rsmoorthy

1

Это даст вам то, что вам нужно, даже если оно все еще находится в разработке. http://www.mongodb.org/display/DOCS/Aggregation+Framework

+0

Я просмотрел документы в этом URL-адресе, но не нашел способа выбрать соответствующие элементы из поля массива. – rsmoorthy

+0

Что вам нужно сделать, это $ отменить поле массива. Затем вы можете просто использовать оператор $ match для фильтрации результатов. После того, как результаты будут отфильтрованы, вы можете $ project, и у вас должен быть набор записей, который вы ищете. – pdxwebdev

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