2013-03-22 3 views
0

данных:как запросить в MongoDB

[{   
        "shop_ID" : "ABCD", 
        "plan" : 2, 
        "planType" : 2, 
        "goods_id" : "9612", 
        "category" : "1", 
        "keywords" : [ 
         { 
          "keyword" : "lianyiqun", 
          "price" : 3.12, 
          "score" : 9 
         }, 
         { 
          "keyword" : "nvzhuang", 
          "price" : 6.57, 
          "score" : 6 
         }, 
         { 
          "keyword" : "chunzhuang", 
          "price" : 5.55, 
          "score" : 8 
         } 
        ] 
       }, 
       { 
        "shop_ID" : "ABCD", 
        "plan" : 2, 
        "planType" : 2, 
        "goods_id" : "5078", 
        "category" : "1", 
        "keywords" : [ 
         { 
          "keyword" : "lianyiqun", 
          "price" : 9.26, 
          "score" : 8 
         }, 
         { 
          "keyword" : "nvzhuang", 
          "price" : 4.52, 
          "score" : 9 
         } 
        ] 
       }] 

я использовал команду запроса:

db.test.find ({ "ключевые слова": {$ elemMatch: { "забьют": { «$ gte»: 8}}}})

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

И, используйте команду db.test.find ({ "ключевые слова". Счет ": {" $ GTE ": 8}}).

результат тот же

Я хочу результат запроса, как это для первого документа:

{   
         "shop_ID" : "ABCD", 
         "plan" : 2, 
         "planType" : 2, 
         "goods_id" : "9612", 
         "category" : "1", 
         "keywords" : [ 
          { 
           "keyword" : "lianyiqun", 
           "price" : 3.12, 
           "score" : 9 
          }, 
          { 
           "keyword" : "chunzhuang", 
           "price" : 5.55, 
           "score" : 8 
          } 
         ] 
        }, 

Как запросить внутренний документооборот

ответ

0

Существует $elemMatch проекции оператор, который будет возвращаться из каждого массива Один элемент, который соответствует вашему условию:

db.test.find({ } , 
       { keywords: { $elemMatch: { score: { $gte: 8 } } } } 
      ) 

Чтобы вернуть все элементы в вашем поддокументе со счетом> = 8, вы можете использовать aggregation framework:

db.test.aggregate ([ { $unwind: "$keywords" }, 
         { $match: { "keywords.score" : { $gte: 8 } } } 
        ]) 

С уважением

+0

Спасибо, Кей. Но у меня есть еще одно требование: если я хочу использовать это в операции mapreduce, но функция db.collection.mapReduce() не поддерживает агрегат. Если я напишу вот так: db.test.mapReduce ( mapFunction, reduceFunction, {out: "map_reduce_test", query: [{$ unwind: "$ keywords"}, {$ match: {"keywords.score" : {$ GTE: 8}}}], } ), выход: карта уменьшают не удалось: { \t "ErrMsg": "исключение: запрос должен быть пустым или объект", \t "код": 13608, \t "ok": 0 – normalnotebook

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