2014-12-02 80 views
1

我有兩個集合:persons(百萬)和groups。當創建一個group我有一個rule,這實際上是發現persons的標準。現在,我想要做的是將groups_id添加到所有匹配的persons在MongoDB中標記集合

請求我的API:

POST /groups { 
    "rule": {"age": {"$gt": 18}}, 
    "description": "persons above 18" 
} 

在我的MongoDB:

db.persons.find({"age": {"$gt": 18}}) 

現在我想的group_id添加到groups陣列場中的每個匹配persons,使我以後可以得到小組中的所有人。這可以直接在相同的查詢中完成嗎?

回答

1

也許我失去了一些東西,但一個簡單的update聲明應該這樣做:

db.persons.update(
    { "age" : {$gt : 18} }, 
    { $addToSet : { "groups" : groupId }}, 
    false, // no upsert ($addToSet and $push still add the field) 
    true); // update multiple docs in this query 

注意$push會一遍又一遍地添加相同的價值,同時$addToSet將確保陣列,這可能是在獨特性在這種情況下是有道理的。

不過,您必須在不同的語句中查找/插入組本身。

+0

謝謝。我有一個簡短的跟進:在將查詢條件對象直接從API輸入傳遞給MongoDB時,是否存在任何(注入)風險? – jgroenen 2014-12-02 13:27:47

+1

是的,另請參閱http://docs.mongodb.org/manual/faq/developers/#javascript上的MongoDB FAQ。你可以在查詢中使用'$ where',它允許任意的javascript執行。即使您設法過濾所有寫入語句,仍然可以使用一個荒謬低效的查詢(或者簡單地說是一個無限循環)來拖延您的系統,或者創建一個'$ where:true'子句,這將導致所有用戶的更新它使用(索引)數據洪泛數據庫,這也將淹沒系統。 – mnemosyn 2014-12-02 13:38:45