2013-03-02 59 views
0

如何使用mongodb allanbank異步驅動程序更新集合中的字段?mongodb更新字段異步驅動程序

當我說

db.getCollection("coll_name").update(//$NON-NLS-1$ 
       BuilderFactory.start().add("_id", docObjectId), 
       BuilderFactory.start().add("field", value)); //$NON-NLS-1$ 

我得到更新爲新值所需的領域,但在文檔中的所有其他領域消失。換句話說,mongo shell中的$set的模擬是什麼?

回答

0

我非常感謝羅布摩爾的回答,他的幫助是非常寶貴的。但是有一點不準確:我必須添加pop()以便一切正常。因此:

DocumentBuilder update = BuilderFactory.start(); 
update = (DocumentBuilder)update.push("$set").add("field", value).pop(); //$NON-NLS-1$ //$NON-NLS-2$ 

db.getCollection("coll").update(//$NON-NLS-1$ 
    BuilderFactory.start().add("_id", docObjectId), //$NON-NLS-1$ 
    update); 
+0

您正在使用哪個版本的驅動程序?如果我當前的版本不起作用,那是一個錯誤。在我編輯的第一個版本的答案中,我忘記了彈出窗口,不需要在更新調用之外拉動更新構造。在你的版本(也可以),你不應該需要彈出()和分配回'更新'。 DocumentBuilder跟蹤其子建設者並在構建時將其解決爲最終形式。 – 2013-03-03 15:38:32

+0

@RobMoore我還需要pop()才能使用最新的2.0.1驅動程序正確工作。如果不是$ set操作符丟失 – lujop 2015-01-02 11:41:18

+0

@lujop你介意用簡單的測試用例寫一個問題嗎? https://github.com/allanbank/mongodb-async-driver/issues感謝Rob。 – 2015-01-02 21:43:35

2

您需要直接將$ set操作符用於子文檔。例如,

DocumentBuilder update = BuilderFactory.start(); 
update.push("$set").add("field", value); //$NON-NLS-1$ 

db.getCollection("coll_name").update(//$NON-NLS-1$ 
      BuilderFactory.start().add("_id", docObjectId), 
      update);