2014-06-09 1 views
-1

enter image description hereВ Операторах в MongoDB

это моя коллекция структура травма содержит данные травмы у меня есть два injuryid так я JST хочу, чтобы эти травмы , например, у меня есть 2 идентификаторов (538d9e7ed173e5202a000065,538f21868a5fc5e01f000065), то я должен получить только 1-й два массива я пользователь IN оператора BT еще получить все 3 array..i пытался ниже запрос

 db.users.find(
        {"injury._id":{$in:[ObjectId("538d9e7ed173e5202a000065"), 
             ObjectId("538f21868a5fc5e01f000065")]} 
        }) 

используя, что я получил все 3 массив

+1

Да. Это массив, и это не фильтрует массив. У вас также есть аналогичные вопросы, которые вы задали раньше, и им были даны ответы относительно того, как это сделать, но вы не представили свои данные ни на одном из них, и вы снова сделали то же самое, предоставив скриншот, а не фактические данные. Я предлагаю вам вернуться к своим предыдущим вопросам и уточнить свои данные, чтобы на самом деле можно было провести через это. –

ответ

1

что вам нужно понять здесь является то, что ваш запрос предназначен для фильтрации «документов» и не фильтрует элементы массива «внутри» документа. Для того, чтобы фактически фильтровать содержимое массива для более чем одной игры вам необходимо использовать структуру агрегации:

db.users.aggregate([ 
    // Matches the "documents" containing those elements in the array 
    { "$match": { 
     "injury._id":{ 
      "$in": [ 
       ObjectId("538d9e7ed173e5202a000065"), 
       ObjectId("538f21868a5fc5e01f000065") 
      ] 
     } 
    }}, 

    // Unwind the array to de-normalize as documents 
    { "$unwind": "$injury" }, 

    // Match the array members 
    { "$match": { 
     "injury._id":{ 
      "$in": [ 
       ObjectId("538d9e7ed173e5202a000065"), 
       ObjectId("538f21868a5fc5e01f000065") 
      ] 
     } 
    }}, 

    // Group back as an array 
    { "$group": { 
     "_id": "$_id", 
     "injury": { "$push": "$injury" } 
    }} 

]) 

Под MongoDB 2.6 и выше, вы можете использовать $map фильтровать массив:

db.users.aggregate([ 
    // Matches the "documents" containing those elements in the array 
    { "$match": { 
     "injury._id":{ 
      "$in": [ 
       ObjectId("538d9e7ed173e5202a000065"), 
       ObjectId("538f21868a5fc5e01f000065") 
      ] 
     } 
    }}, 

    // Project with $map to filter 
    { "$project": { 
     "injury": { 
      "$setDifference": [ 
       { "$map": { 
        "input": "$injury", 
        "as": "el", 
        "in": { 
         "$cond": [ 
         { 
          "$or": [ 
            { "$eq": [ 
             "$$el._id" 
             ObjectId("538d9e7ed173e5202a000065") 
            ]}, 
            { "$eq": [ 
             "$$el._id" 
             ObjectId("538f21868a5fc5e01f000065") 
            ]} 
           ] 
          }, 
          "$$el", 
          false 
         ] 
        } 
       }}, 
       [false] 
      ] 
     } 
    }} 

]) 
+0

ya спасибо ... его работа – MaTya

+0

@MaTya Я уверен, что так и есть. В целом хорошо «принимать» ответы, которые помогут вам. Помогает людям понять, как работает решение, и помогает тем, кто вам помогает. И не забывайте другие вопросы, которые вы оставили открытым. –