2015-12-04 2 views
0

Моя коллекция Coll являетсяПолучить несколько объектов из массива в различных документах MongoDb

/* 1 */ 
{ 
    "_id" : ObjectId("566121aa4b88d840eb7d1c50"), 
    "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"), 
    "array" : [ 
     { 
      "id" : 1 
     }, 
     { 
      "id" : 2 
     }, 
     { 
      "id" : 3 
     }, 
     { 
      "id" : 4 
     } 
    ] 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("5661224a4b88d840eb7d1c51"), 
    "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"), 
    "array" : [ 
     { 
      "id" : 1 
     }, 
     { 
      "id" : 7 
     }, 
     { 
      "id" : 3 
     }, 
     { 
      "id" : 5 
     } 
    ] 
} 

то, что мне нужно, чтобы тянуть объекты в массиве «массив», где batchCourseId = ObjectId («566122ab94b792fbdf81bcf3»)

и 2<array.id<=5

ожидается выход

/* 1 */ 
    { 
     "_id" : ObjectId("566121aa4b88d840eb7d1c50"), 
     "array" : [    
      { 
       "id" : 3 
      }, 
      { 
       "id" : 4 
      } 
     ] 
    } 

/* 2 */ 
{ 
    "_id" : ObjectId("5661224a4b88d840eb7d1c51"), 
    "array" : [    
     { 
      "id" : 3 
     }, 
     { 
      "id" : 5 
     } 
    ] 
} 

уже пытались

db.coll.find({"batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3")}, 
    { array: { $elemMatch: { id: { $gt: 2,$lte: 5} } } }) 

выход подобен

/* 1 */ 
{ 
    "_id" : ObjectId("566121aa4b88d840eb7d1c50"), 
    "array" : [ 
     { 
      "id" : 3 
     } 
    ] 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("5661224a4b88d840eb7d1c51"), 
    "array" : [ 
     { 
      "id" : 3 
     } 
    ] 
} 

близко, но только первый объект согласования в массиве находится в результате

FYI этого единственного набора выборки данных исходные данные более сложные и большие в подсчете

поэтому pls препятствуют мне знать самое лучшее для того чтобы сделать это, представление также важно

заблаговременно

+0

Это может помочь вам: [запрос к извлекаемому-множественным объектам-в-ап- array-in-mongodb] (http://stackoverflow.com/questions/27937620/query-to-retrieve-multiple-objects-in-an-array-in-mongodb) – manojpt

ответ

2

Вы можете использовать агрегацию для достижения того же. Образец приведен ниже:

db.coll.aggregate(
    {$match: {"batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3")}}, 
    {$unwind: '$array'}, 
    {$match: {'array.id': { $gt: 2,$lte: 5}}}, 
    {$group: {_id: '$_id', array: {$push : '$array'}}} 
) 

Результат:

{ "_id" : ObjectId("5661224a4b88d840eb7d1c51"), "array" : [ { "id" : 3 }, { "id" : 5 } ] } 
{ "_id" : ObjectId("566121aa4b88d840eb7d1c50"), "array" : [ { "id" : 3 }, { "id" : 4 } ] } 
+0

уже пробовал агрегат для этого, но, как я сказал это набор образцов, не работающий в исходном наборе в этом массиве.id в int64/NumberLong() делает какие-либо изменения, результат получается со всем массивом, когда для исходных данных –

+0

работал на исходный набор с небольшими изменениями благодаря Sarath Nair –

2

В агрегации MongoDB $unwind создает Cartesian_product проблему так и в большой набор данных является хорошим способом, чтобы избежать $unwind.

Давайте проверим с вашим примером, если вы используете $unwind в aggregation то результат выглядит следующим образом

db.collectionName.aggregate([ 
    { "$match": { "batchCourseId": ObjectId("566122ab94b792fbdf81bcf3") }}, 
    { "$unwind": "$array" } 
]) 

поэтому результат указанного запроса:

{ "_id" : ObjectId("566121aa4b88d840eb7d1c50"), "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"), "array" : { "id" : 1 } } 
{ "_id" : ObjectId("566121aa4b88d840eb7d1c50"), "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"), "array" : { "id" : 2 } } 
{ "_id" : ObjectId("566121aa4b88d840eb7d1c50"), "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"), "array" : { "id" : 3 } } 
{ "_id" : ObjectId("566121aa4b88d840eb7d1c50"), "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"), "array" : { "id" : 4 } } 
{ "_id" : ObjectId("5661224a4b88d840eb7d1c51"), "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"), "array" : { "id" : 1 } } 
{ "_id" : ObjectId("5661224a4b88d840eb7d1c51"), "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"), "array" : { "id" : 7 } } 
{ "_id" : ObjectId("5661224a4b88d840eb7d1c51"), "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"), "array" : { "id" : 3 } } 
{ "_id" : ObjectId("5661224a4b88d840eb7d1c51"), "batchCourseId" : ObjectId("566122ab94b792fbdf81bcf3"), "array" : { "id" : 5 } } 

это создать несколько документов, и в больших документы в коллекциях замедляют производительность и увеличивают время обработки.

Вместо $unwind использование $map агрегации с aggregation-set operator и запросом, как показано ниже:

db.collection.aggregate([{ 
    "$match": { 
    "batchCourseId": ObjectId("566122ab94b792fbdf81bcf3") 
    } 
}, { 
    "$project": { 
    "array": { 
     "$setDifference": [{ 
      "$map": { 
      "input": "$array", 
      "as": "el", 
      "in": { 
       "$cond": { 
       "if": { 
        "$and": [{ 
        "$gt": ["$$el.id", 2] 
        }, { 
        "$lte": ["$$el.id", 5] 
        }] 
       }, 
       "then": "$$el", 
       "else": false 
       } 
      } 
      } 
     }, 
     [false] 
     ] 
    } 
    } 
}]) 
Смежные вопросы