如何使用 MongoDB 和 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。


我缺少什么?


慕码人2483693
浏览 69回答 2
2回答

郎朗坤

更新中的美元符号的解释方式与聚合框架中的方式不同。作为解决方法,您可以使用$out运算符,它将用聚合管道的结果替换现有集合。col.Aggregate()    .AppendStage<BsonDocument>(                        BsonDocument.Parse("{ $addFields: { \"Sids\": [\"$Sid\"] }}"))    .Out("col");

月关宝盒

从 mongodb 服务器 v4.2 开始,您可以使用聚合管道阶段引用文档的现有字段。如果有人感兴趣,这里有一个使用 MongoDB.Entities 执行相同操作的示例程序:using MongoDB.Entities;using System;using System.Collections.Generic;namespace StackOverflow{    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();        }    }}
打开App,查看更多内容
随时随地看视频慕课网APP