[英]MongoDB Driver C# Update a single field in Nested Array of Objects
[英]MongoDB with C# Driver: How to filter on field within nested array of objects
我是 MongoDB 的新手,一直在努力解決這個問題。 假設我有一個包含 ID、名稱和對象數組的文檔:
{
"_id": {
"$oid": "614ba49b46727413d60b99e2"
},
"Name": 1,
"ObjectArray": [
{
"ObjectId": {
"$oid": "614ba49b46727413d60b99e3"
},
"Value": "some value",
},
{
"ObjectId": {
"$oid": "614ba49b46727413d60b99e5"
},
"Value": "other value",
}
],
}
我有一個映射到該文檔的 C# class,在這方面一切正常。 假設我想在 object 數組中添加另一個 object,只有當新對象的 ID 不存在於數組中時? 我正在為此使用 C# 驅動程序並嘗試了幾件事。
我嘗試了幾個想法,包括以下 -
var filter = FilterBuilder.Eq(x => x.Id, id) &
FilterBuilder.Nin(x => x.ObjectArray[-1].ObjectId, new[] { newDoc.ObjectId});
不幸的是,這只檢查 object 數組中的第一個 object。 因此,如前所述,如果條件全部存在於一個過濾器中,我如何只向數組添加一個新的 object?
謝謝你的時間。
*** 解決方案 ***
將 Elematch 與 Not 結合使用,將過濾全部合二為一。
var filter = FilterBuilder.Eq(x => x.Id, id) &
FilterBuilder.Not(FilterBuilder.ElemMatch(x => x.ObjectArray,
Builders<ObjectClass>.Filter.Eq(y => y.ObjectId, newDoc.ObjectId)));
您可以使用$elemMatch
訪問和過濾嵌套屬性。 並將該值與$eq
進行比較。
{
"ObjectArray": {
$elemMatch: {
"ObjectId": {
$eq: <value>
}
}
}
}
完成MongoDB聚合查詢
db.collection.aggregate([
{
$match: {
$and: [
{
"_id": {
// With Exist _id
$eq: ObjectId("614ba49b46727413d60b99e2")
}
},
{
"ObjectArray": {
$elemMatch: {
"ObjectId": {
// With unexist ObjectArray.ObjectId
$eq: ObjectId("614ba49b46727413d60b99e3")
}
}
}
}
]
}
}
])
對於 MongoDB .NET/C# 驅動程序
var filter = FilterBuilder.Eq(x => x.Id, id) &
FilterBuilder.ElemMatch(x => x.ObjectArray,
Builders<ObjectClass>.Filter.Eq(y => y.ObjectId, newDoc.ObjectId);
將ObjectClass
替換為ObjectArray
中 Object 的 class 名稱。
備注:
通過上述解決方案,當ObjectArray
中存在解析的ObjectId
時,它將返回文檔。 因此,您應該對現有的ObjectId
案例進行處理。
並且只有在沒有查詢到文檔時才將文檔添加到ObjectArray
中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.