$unset 二维数组 MongoDB (C#)
$unset 2D array MongoDB (C#)
早上好,
我有一个关于 MongoDb 的问题,我正在尝试取消设置“引用”的索引,在我的 Json 上,您可以看到 1 个字段引用和 2 个引用:“Saisir ou Selection une citations”和“XD”,我想取消设置 XD,我该如何实现?
{
"_id" : ObjectId("604ca13de0059b65e4e67c01"),
"username" : "LOL",
"pass" : "LOL",
"citations" : [
[
{
"body" : "Saisir ou Selection une citations",
"author" : "author",
"oeuvre" : "oeuvre",
"annee" : NumberInt(1)
}
],
[
{
"body" : "XD",
"author" : "XD",
"oeuvre" : "XD",
"annee" : NumberInt(3)
}
]
]
}
我试过很多东西:
db.getCollection("Users").update(
{}, {$unset : {"citations.$.body" : "XD"}}
)
我尝试了许多其他变体,但没有找到正确的解决方案。
PS :
我正在开发一个 C# Wpf 应用程序,如果你能在这种语言上帮助我,那将是完美的,但不用担心,它并没有太大的不同
在更新函数中你需要给出第一个条件。您可能需要使用“$pull”从数组中删除值。
应该是这样的:
db.getCollection("Users").update(
{citations.body: "XD"}, {$pull : {"citations.$.body" : "XD"}}
)
您将不得不使用 c# 驱动程序中的 ElemMatch
和 PullFilter
运算符来实现您的目标,如下所示:
var filter = Builders<User>.Filter.ElemMatch(
u => u.Citations,
c => c.Body == "XD");
var update = Builders<User>.Update.PullFilter(
u => u.Citations,
c => c.Body == "XD");
await userCollection.UpdateManyAsync(filter, update);
这是使用 MongoDB.Entities 库(我写的)做同样事情的另一种不那么冗长的方法:
using MongoDB.Entities;
using System.Linq;
using System.Threading.Tasks;
namespace TestApplication
{
public class User : Entity
{
public Citation[] Citations { get; set; }
}
public class Citation
{
public string Body { get; set; }
}
public static class Program
{
private static async Task Main()
{
await DB.InitAsync("test");
await new[] {
new User {
Citations = new[]
{
new Citation { Body = "Saisir ou Selection une citations"},
new Citation { Body = "XD"},
}
},
new User {
Citations = new[]
{
new Citation { Body = "Saisir ou Selection une citations"},
new Citation { Body = "XD"},
}
}
}.SaveAsync();
await DB.Update<User>()
.Match(u => u.Citations.Any(c => c.Body == "XD"))
.Modify(f => f.PullFilter(u => u.Citations, c => c.Body == "XD"))
.ExecuteAsync();
}
}
}
早上好,
我有一个关于 MongoDb 的问题,我正在尝试取消设置“引用”的索引,在我的 Json 上,您可以看到 1 个字段引用和 2 个引用:“Saisir ou Selection une citations”和“XD”,我想取消设置 XD,我该如何实现?
{
"_id" : ObjectId("604ca13de0059b65e4e67c01"),
"username" : "LOL",
"pass" : "LOL",
"citations" : [
[
{
"body" : "Saisir ou Selection une citations",
"author" : "author",
"oeuvre" : "oeuvre",
"annee" : NumberInt(1)
}
],
[
{
"body" : "XD",
"author" : "XD",
"oeuvre" : "XD",
"annee" : NumberInt(3)
}
]
]
}
我试过很多东西:
db.getCollection("Users").update(
{}, {$unset : {"citations.$.body" : "XD"}}
)
我尝试了许多其他变体,但没有找到正确的解决方案。
PS :
我正在开发一个 C# Wpf 应用程序,如果你能在这种语言上帮助我,那将是完美的,但不用担心,它并没有太大的不同
在更新函数中你需要给出第一个条件。您可能需要使用“$pull”从数组中删除值。
应该是这样的:
db.getCollection("Users").update(
{citations.body: "XD"}, {$pull : {"citations.$.body" : "XD"}}
)
您将不得不使用 c# 驱动程序中的 ElemMatch
和 PullFilter
运算符来实现您的目标,如下所示:
var filter = Builders<User>.Filter.ElemMatch(
u => u.Citations,
c => c.Body == "XD");
var update = Builders<User>.Update.PullFilter(
u => u.Citations,
c => c.Body == "XD");
await userCollection.UpdateManyAsync(filter, update);
这是使用 MongoDB.Entities 库(我写的)做同样事情的另一种不那么冗长的方法:
using MongoDB.Entities;
using System.Linq;
using System.Threading.Tasks;
namespace TestApplication
{
public class User : Entity
{
public Citation[] Citations { get; set; }
}
public class Citation
{
public string Body { get; set; }
}
public static class Program
{
private static async Task Main()
{
await DB.InitAsync("test");
await new[] {
new User {
Citations = new[]
{
new Citation { Body = "Saisir ou Selection une citations"},
new Citation { Body = "XD"},
}
},
new User {
Citations = new[]
{
new Citation { Body = "Saisir ou Selection une citations"},
new Citation { Body = "XD"},
}
}
}.SaveAsync();
await DB.Update<User>()
.Match(u => u.Citations.Any(c => c.Body == "XD"))
.Modify(f => f.PullFilter(u => u.Citations, c => c.Body == "XD"))
.ExecuteAsync();
}
}
}