2014-09-01 64 views
0

我想獲得所有匹配的值,使用$ elemMatch。如何搜索嵌入式數組

// create test data 
db.foo.insert({values:[0,1,2,3,4,5,6,7,8,9]}) 
db.foo.find({},{ 
    'values':{ 
     '$elemMatch':{ 
      '$gt':3 
     } 
    } 
}) ; 

我期待的結果是{values:[3,4,5,6,7,8,9]}。但是,真正的結果是{values:[4]}。 我看了mongo文檔,我明白這是規範。

如何搜索多個值? 而且,我使用'skip'和'limit'。

有什麼想法?

回答

1

使用聚合:

db.foo.aggregate([ 
{$unwind:"$values"}, 
{$match:{"values":{$gt:3}}}, 
{$group:{"_id":"$_id","values":{$push:"$values"}}} 
]) 

您可以在$比賽增加更多的過濾條件,如果你想。

,因爲你不能做到這一點使用$ elemMatch操作,MongoDB的醫生說:

的$ elemMatch投影算限制數組 場被包含在查詢結果的內容只包含與$ elemMatch條件匹配的數組 元素。

注意

The elements of the array are documents. 
+0

謝謝。我再考慮收集結構。 – sekitaka 2014-10-09 06:24:35

0

如果你在上$elemMatch的文檔,或查詢positional $運營商的對應仔細看,你會看到只有「第一」這種類型的「投影」會返回匹配的元素。

您正在查找的內容實際上是對文檔內容的「操縱」,您希望在文檔中「過濾」數組的內容,而不是返回原始或「匹配」元素,因爲可能只有一個比賽。

對於真正的「過濾」你需要的聚合框架,因爲有更多的支持,有沒有文件操作:

db.foo.aggregate([ 

    // No point selecting documents that do not match your condition 
    { "$match": { "values": { "$gt": 3 } } }, 

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

    // Match to "filter" the array 
    { "$match": { "values": { "$gt": 3 } } }, 

    // Group by to the array form 
    { "$group": { 
     "_id": "$_id", 
     "values": { "$push": "$values" } 
    }} 
]) 

或者與2.6及以後,MongoDB的現代版本,其中數組的值是「獨一無二「你可以這樣做:

db.foo.aggregate([ 
    { "$project": { 
     "values": { 
      "$setDifference": [ 
       { "$map": { 
        "input": "$values", 
        "as": "el", 
        "in": { 
         "$cond": [ 
          { "$gt": [ "$$el", 3 ] }, 
          "$$el", 
          false 
         ] 
        } 
       }}, 
       [false] 
      ] 
     } 
    }} 
]) 
+0

謝謝。我瞭解如何使用'$ elemMatch'。 我再考慮收集結構。 – sekitaka 2014-10-09 06:25:23