我試圖從陣列中提取一個或多個物件,但我注意到一些奇怪的事情。
讓我們看看下面的檔案。
{
"_id" : UUID("f7e80c8e-6b4a-4741-95a3-2567cccf9e5f"),
"createdAt" : ISODate("2021-07-19T17:07:28.499Z"),
"description" : null,
"externalLinks" : [
{
"id" : "ZV8xMjM0NQ==",
"type" : "event"
},
{
"id" : "cF8xMjM0NQ==",
"type" : "planning"
}
],
"updatedAt" : ISODate("2021-07-19T17:07:28.499Z")
}
我寫了一個基本的查詢拉一個元素externalLinks,它看起來像
db.getCollection('Collection').update(
{
_id: {
$in: [UUID("f7e80c8e-6b4a-4741-95a3-2567cccf9e5f")]
}
}, {
$pull: {
externalLinks: {
"type": "planning",
"id": "cF8xMjM0NQ=="
}
}
})
它作業正常。但是當我想從externalLinks. 我正在$in為此使用運算子。奇怪的行為在這里:
db.getCollection('Collection').update(
{
_id: {
$in: [UUID("f7e80c8e-6b4a-4741-95a3-2567cccf9e5f")]
}
}, {
$pull: {
externalLinks: {
$in: [{
"type": "planning",
"id": "cF8xMjM0NQ=="
}]
}
}
})
這個查詢不起作用。解決方案是切換兩個欄位externalLinks
并執行以下操作:
$in: [{
"id": "cF8xMjM0NQ==",
"type": "planning"
}]
我嘗試了多種方法,例如:$elemMatch、$positioning,但應該可以拉出多個 externalLinks。我也嘗試了 $and 運算子但沒有成功。
我可以輕松地遍歷 externalLinks 進行更新,但這太容易了。
選擇那個解決方案讓我的大腦發癢。
任何幫助將不勝感激,謝謝!
uj5u.com熱心網友回復:
檔案欄位是有順序的,MongoDB根據欄位的順序比較檔案見這里,所以先放哪個欄位很重要。
在 MongoDB 4.2 之后,我們還可以進行管道更新,有時可能會更大,但它們更強大,感覺更像是編程。(較少宣告和模式匹配)
這并不意味著您需要在您的情況下更新管道,但也可以通過這種方式進行檢查。
詢問
- 管道更新
- 過濾并保留條件不存在的成員
測驗代碼在這里
db.collection.update(
{_id: {$in: ["f7e80c8e-6b4a-4741-95a3-2567cccf9e5f"]}},
[{"$set":
{"externalLinks":
{"$filter":
{"input": "$externalLinks",
"cond":
{"$not":
[{"$and":
[{"$eq": ["$$this.id", "ZV8xMjM0NQ=="]},
{"$eq": ["$$this.type", "event"]}]}]}}}}}])
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/329203.html
標籤:MongoDB
