2016-10-17 39 views
2

我有一個字符串如何確定數組在MongoDB中具有唯一條目?

users: ['user1', 'user2'] 

數組如果我運行的順序搜索尋找確切[「用戶1」,「user2的」],它會發現該條目。但是,如果他們回到前面,查詢不會返回任何內容。

將輸入數組與數據庫中的列表進行比較以確定它是否是唯一條目的最佳方法是什麼?

+0

請看看這個:[mongodb distinct](https://docs.mongodb.com/v3.2/reference/method/db.collection.distinct/) –

回答

0

使用聚合框架與$redact管道運營商允許你用$cond操作proccess邏輯條件和使用專項行動$$KEEP「保持」的文件,其中的邏輯條件爲真或$$PRUNE在條件錯誤的情況下「移除」文檔。

此操作類似於具有$project管線選擇所述集合中的字段,並創建保持從邏輯條件查詢,然後隨後的$match結果的新的領域,不同之處在於$redact用途一個更加高效的單一管道階段。

至於邏輯條件,您可以使用Set Operators,因爲它們允許在數組上執行集操作的表達式,將數組視爲集。設置表達式會忽略每個輸入數組中的重複條目和元素的順序,這是您的案例中的合適屬性,因爲您想要忽略元素的順序。

有一對夫婦這些運營商,你可以用它來進行邏輯條件,即$setIsSubset$setDifference的。


考慮以下實例證明上述概念:

填充測試集

db.collection.insert([ 
    { users: ['user1', 'user2'] }, 
    { users: ['user1', 'user2', 'user2'] }, 
    { users: ['user1', 'user2', 'user3'] }, 
    { users: ['user1', 'user3'] }, 
]) 

實施例1:$redact$setEquals

var arr = [ "user2", "user1" ]; 
db.collection.aggregate([ 
    { 
     "$redact": { 
      "$cond": [ 
       { "$setEquals": [ "$users", arr ] }, 
       "$$KEEP", 
       "$$PRUNE" 
      ] 
     } 
    } 
]) 

樣本輸出

/* 1 */ 
{ 
    "_id" : ObjectId("5804902900ce8cbd028523d1"), 
    "users" : [ 
     "user1", 
     "user2" 
    ] 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("5804902900ce8cbd028523d2"), 
    "users" : [ 
     "user1", 
     "user2", 
     "user2" 
    ] 
} 

實施例2:$redact$setDifference

var arr = [ "user2", "user1" ]; 
db.collection.aggregate([ 
    { 
     "$redact": { 
      "$cond": [ 
       { 
        "$eq": [ 
         { "$setDifference": [ "$users", arr ] }, 
         [] 
        ] 
       }, 
       "$$KEEP", 
       "$$PRUNE" 
      ] 
     } 
    } 
]) 

樣本輸出

/* 1 */ 
{ 
    "_id" : ObjectId("5804902900ce8cbd028523d1"), 
    "users" : [ 
     "user1", 
     "user2" 
    ] 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("5804902900ce8cbd028523d2"), 
    "users" : [ 
     "user1", 
     "user2", 
     "user2" 
    ] 
} 

另一種方法,雖然只是建議在$redact不可用,將使用$where操作爲:

db.collection.find({ 
    "$where": function() { 
     var arr = ["user2", "user1"]; 
     return !(this.users.sort() > arr.sort() || this.users.sort() < arr.sort()); 
    } 
}) 

但是,請記住,這將不會很好地執行,因爲操作符調用時的查詢操作與$where e JavaScript引擎評估每個文檔的Javascript代碼並檢查每個文檔的條件。

這是非常緩慢,因爲MongoDB的前$where表達式計算非$where查詢操作和非$where查詢語句可以使用索引。

如果可以的話,建議將索引查詢組合起來,以便查詢速度更快。但是,如果不能以任何其他方式構建數據,或者處理少量數據時,建議使用JavaScript表達式和運算符作爲最後的手段。

1

通過以下查詢,您可以識別集合中的唯一數組。

db.getCollection('mycollection').find({users: { $size: 2, $all: [ "user1" , "user2" ] }}) 

你需要提到的號碼。您正在檢查的數組中的元素,並通過$ all操作符檢查其中的所有元素。

相關問題