2011-12-06 31 views
0

我想有兩個點符號參數更新現有的文檔,我的查詢:

{ _id: "4eda5...", comments._id: "4eda6...", comments.author: "john" }

我的更新是:

{ "comments.$.deleted": true }

但古怪的是,當我通過非 - 評論ID +作者的組合,它只是更新了該作者的第一個匹配評論。

任何想法爲什麼發生這種情況?

編輯:C#代碼示例

var query = Query.And(Query.EQ("_id", itemId), Query.EQ("cmts._id", commentId)); 
if (!string.IsNullOrEmpty(author)) 
    query = Query.And(query, Query.EQ("cmts.Author", author)); 

var update = Update.Set("cmts.$.deleted", true); 
var result = myCol.Update(query, update, UpdateFlags.None, SafeMode.True); 
+0

你能再細說一下嗎?你使用官方的C#驅動程序嗎?如果是這樣,你能顯示你使用的C#代碼嗎? – mnemosyn

+0

添加了一個c#代碼示例,我不知道我怎麼能詳細說明更多 - 與錯誤_id(但正確的作者)的評論得到更新。 – Madd0g

+0

@mnemosyn,是的,官方驅動程序 – Madd0g

回答

1

你想$ elemMatch如果你想_id和作者是在同一個註釋。真的,你的查詢沒有什麼意義,包括作者,因爲id應該像你可以得到的那樣唯一,不是嗎?

它基於第一個匹配的數組元素,它替換了更新中的「$」。

這是通過設計工作。它類似於或因爲它可以找到一個既有_id也有作者匹配任何數組元素的文檔。

+0

啊......這是一個安全功能(有點嘿嘿)。我希望管理員和發佈評論的用戶能夠刪除它。如果一個管理員正在這樣做 - 只有_id應匹配,如果作者正在這樣做 - _id和作者應匹配。我這樣做是爲了避免拉動文檔並檢查發佈評論的人是否有更好的方法?這是我能想到的 - id是唯一的。感謝$ elemMatch指針 - 我會檢查它(我希望它可以在步驟中建立,所以我仍然可以使用該用戶名稱)if – Madd0g

0

該查詢不按照您期望的方式工作。基本上,當使用$位置表示法時,您需要確保您的查詢只有一個查詢數組的子句,否則它應該引用兩個數組比較中的哪一個不明確。

在你的情況,你所要求的一個文檔,其中:

  1. 的_id等於某個值
  2. 的意見陣列包含了一些文件,其中_id等於某個值
  3. 的comments數組包含一些文檔,其中作者等於某個值

查詢中沒有任何內容說明2.和3.需要由同一個文檔滿足。

因此,即使您使用的是不存在的comment._id和comment.author組合,您的評論數組也至少有一個條目,其中_id等於您的搜索值和其他條目(而不是同一個)作者等於您的搜索值。

由於作者是最後一個被檢查過的,這就是設置$的值,這就是爲什麼數組元素得到更新。

+0

>在您的查詢中沒有任何內容說明2.和3.需要由同一份文件來滿足。 這是令人困惑的部分,我會希望'Query.And()'來處理,但我猜它對數組的作用是不同的 – Madd0g

相關問題