如何使用 MongoDB 和 C# 使用另一个字段的值更新文档?
How to update documents using another field's value using MongoDB and C#?
我正在尝试在集合中的所有文档中创建一个新字段。该字段将是一个数组,另一个字段的值作为(目前)单个值。
这是我的代码:
var builder = new UpdateDefinitionBuilder<Member>();
var update = builder.AddToSet(f => f.Sids, "$Sid");
var models = new WriteModel<Member>[]
{
new UpdateManyModel<Member>(FilterDefinition<Member>.Empty, update)
};
new MongoClient().GetDatabase("mydb").GetCollection<Member>().BulkWrite(models);
几乎成功了:新字段 (Sids
) 被创建为一个数组,但其文字值 $Sid
而不是 Sid
字段中的值。
我错过了什么?
更新中美元符号的解释方式与聚合框架中的不同。旧的 Whosebug 线程 here。
作为解决方法,您可以使用 $out 运算符,它将用聚合管道的结果替换现有集合。
col.Aggregate()
.AppendStage<BsonDocument>(
BsonDocument.Parse("{ $addFields: { \"Sids\": [\"$Sid\"] }}"))
.Out("col");
mickl 的精彩回答...
从 mongodb 服务器 v4.2 开始,您可以使用 here.
所述的聚合管道阶段来引用文档的现有字段
如果有人感兴趣,这里有一个使用 MongoDB.Entities 做同样事情的示例程序:
using MongoDB.Entities;
using System;
using System.Collections.Generic;
namespace Whosebug
{
public class Program
{
public class Member : Entity
{
public string Sid { get; set; }
}
private static void Main(string[] args)
{
new DB("test");
var members = new List<Member>();
for (int i = 1; i <= 10; i++)
{
members.Add(new Member
{
Sid = Guid.NewGuid().ToString()
});
}
members.Save();
DB.Update<Member>()
.Match(_ => true)
.WithPipelineStage("{ '$set': { 'Sids': ['$Sid'] } }")
.WithPipelineStage("{ '$unset': ['Sid'] }")
.ExecutePipeline();
}
}
}
我正在尝试在集合中的所有文档中创建一个新字段。该字段将是一个数组,另一个字段的值作为(目前)单个值。
这是我的代码:
var builder = new UpdateDefinitionBuilder<Member>();
var update = builder.AddToSet(f => f.Sids, "$Sid");
var models = new WriteModel<Member>[]
{
new UpdateManyModel<Member>(FilterDefinition<Member>.Empty, update)
};
new MongoClient().GetDatabase("mydb").GetCollection<Member>().BulkWrite(models);
几乎成功了:新字段 (Sids
) 被创建为一个数组,但其文字值 $Sid
而不是 Sid
字段中的值。
我错过了什么?
更新中美元符号的解释方式与聚合框架中的不同。旧的 Whosebug 线程 here。
作为解决方法,您可以使用 $out 运算符,它将用聚合管道的结果替换现有集合。
col.Aggregate()
.AppendStage<BsonDocument>(
BsonDocument.Parse("{ $addFields: { \"Sids\": [\"$Sid\"] }}"))
.Out("col");
mickl 的精彩回答...
从 mongodb 服务器 v4.2 开始,您可以使用 here.
所述的聚合管道阶段来引用文档的现有字段如果有人感兴趣,这里有一个使用 MongoDB.Entities 做同样事情的示例程序:
using MongoDB.Entities;
using System;
using System.Collections.Generic;
namespace Whosebug
{
public class Program
{
public class Member : Entity
{
public string Sid { get; set; }
}
private static void Main(string[] args)
{
new DB("test");
var members = new List<Member>();
for (int i = 1; i <= 10; i++)
{
members.Add(new Member
{
Sid = Guid.NewGuid().ToString()
});
}
members.Save();
DB.Update<Member>()
.Match(_ => true)
.WithPipelineStage("{ '$set': { 'Sids': ['$Sid'] } }")
.WithPipelineStage("{ '$unset': ['Sid'] }")
.ExecutePipeline();
}
}
}