gpt4 book ai didi

c# - Mongodb C# 驱动程序更新所有子数组元素

转载 作者:行者123 更新时间:2023-12-02 22:38:16 24 4
gpt4 key购买 nike

我想更新文档并为子文档数组设置一个值。使用documentation我必须使用 $[] 运算符。

已关注 this链接现在可以做这样的事情:

db.coll.update({}, {$set: {“a.$[].b”: 2}})
Input: {a: [{b: 0}, {b: 1}]}
Output: {a: [{b: 2}, {b: 2}]}

例如,此请求将在我的情况下完成工作:

db.collection.update(
{ "History": { "$elemMatch": { "status": { "$ne": "PROCESSED" } } } },
{ "$set": { "History.$[].flag": false } },
{ "multi": true }
)

但我没有找到使用驱动程序在 C# 中执行 $[] 运算符的方法。并且驱动程序文档不包含该信息。

有人可以给我提供一个 C# 示例吗?

最佳答案

你可以这样实现:

            collection.UpdateMany(
x => x.History.Any(h => h.status != "PROCESSED"),
Builders<YourType>.Update.Set("History.$[].flag", false));

这是另一种强类型解决方案:

using MongoDB.Entities;
using MongoDB.Entities.Core;
using System.Linq;

namespace StackOverflow
{
public class Test : Entity
{
public Event[] History { get; set; }
}

public class Event
{
public bool flag { get; set; }
public string status { get; set; }
}

public class Program
{
private static void Main(string[] args)
{
new DB("test", "localhost");

(new[] {
new Test { History = new[]{
new Event { flag = true, status = "PROCESSED" } } },

new Test { History = new[]{
new Event { flag = true, status = "NOT-PROCESSED" },
new Event { flag = true, status = "NOT-PROCESSED" }
}}
}).Save();

var field = Prop.PosAll<Test>(t => t.History[0].flag);

DB.Update<Test>()
.Match(t => t.History.Any(h => h.status != "PROCESSED"))
.Modify(b => b.Set(field, false))
.Execute();
}
}
}

关于c# - Mongodb C# 驱动程序更新所有子数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59270818/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com