2014-11-23 64 views
1

一組給定的子場我有一個文件,看起來像這樣 { "field1":"value1", "field2":{"unknown_key1":"value2", "unknown_key2":"value3", ... "unknown_keyN":"valueN"} }MongoDB中找到,其中在PHP

和陣列(「ARR1」,「ARR2」,「ARR3」)

我的所有記錄想要查詢查找所有未知密鑰都在我的數組定義的集合中的所有文檔,但這些密鑰的數量N和它們的值未知。這在Mongodb中是可能的,如果是這樣的話,我會怎麼做。

+0

是你的數組包含此array(「unknown_key1」,「unknown_key2」,....,「」unknown_keyN「)? – Yogesh 2014-11-24 06:12:48

+0

沒有我的數組包含其他鍵我想查找所有未知鍵是陣列中其他鍵之一的所有文檔 – rgio 2014-11-24 10:53:53

+0

It意味着一些未知的密鑰出現在陣列中嗎? – Yogesh 2014-11-24 11:16:17

回答

0

我對PHP並不熟悉,但是您通常在其他語言中使用的是對象數組,然後使用子註釋來實現此目的。

如:

"field1":"value1", 
"field2":[ 
    {"unknown_key1":"value2"}, 
    {"unknown_key2":"value3"} 
    ... 
    {"unknown_keyN":"valueN"} 
    ] 

然後你就可以通過

...find({"field2.unknown_key1": "value2", ... }) 

找到他們在這裏看到另一個例子Mongo Query on Subfields

+0

當我不知道什麼是unknown_key1,雖然 – rgio 2014-11-24 10:52:22

1

按你的問題,我認爲你的陣列中的一些數字unknown_key禮物的假設如果您的陣列包含以下值,則

var values = ("arr1","arr2","arr3",..."unknown_key1","unknown_key2",.."arrN") 

如果是正確的,那麼你應該使用下面的查詢找出

for(i = 0; i < values.length ; i++) { 
db.collectionName.find({},{"field2."+values[i]:1}) 
} 
0

您可以在此情況下,使用$where。如果任何未知的按鍵應該是由陣列定義的集合:

db.collection_name.find({$where: function() { 
    var myarr = ["unknown_key", "arr1", "arr2", "arr3"]; 
    for(var key in this.field2) { 
    var subkey = key.substr(0, key.length-1); //get unknown_key from unknown_keyN 
    var id = myarr.indexOf(subkey); // check if in array 
    if (id != -1) return true; 
    } 
    return false; 
}}) 

如果所有的未知鍵應該是由陣列定義的集合:

db.collection_name.find({$where: function() { 
    var myarr = ["unknown_key", "arr1", "arr2", "arr3"]; 
    if (this.field2 != undefined) { 
    for(var key in this.field2) { 
     var subkey = key.substr(0, key.length-1); //get unknown_key from unknown_keyN 
     var id = myarr.indexOf(subkey); // check if in array 
     if (id == -1) return false; 
    } 
    return true; 
    } else { 
    return false; 
    } 
}}) 
+0

$查詢可能非常緩慢,我怎麼能找到field2.unknown_key1。更好地更改文檔以滿足更好的搜索查詢 – astroanu 2014-11-25 06:30:22