为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 MongoDB 和 C# 使用另一个字段的值更新文档?

如何使用 MongoDB 和 C# 使用另一个字段的值更新文档?

C#
慕码人2483693 2023-09-24 15:45:26
我正在尝试在集合中的所有文档中创建一个新字段。该字段将是一个数组,其中另一个字段的值作为(目前)单个值。这是我的代码: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。我缺少什么?
查看完整描述

2 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

更新中的美元符号的解释方式与聚合框架中的方式不同。

作为解决方法,您可以使用$out运算符,它将用聚合管道的结果替换现有集合。

col.Aggregate()
   .AppendStage<BsonDocument>(
                       BsonDocument.Parse("{ $addFields: { \"Sids\": [\"$Sid\"] }}"))
   .Out("col");


查看完整回答
反对 回复 2023-09-24
?
月关宝盒

TA贡献1772条经验 获得超5个赞

从 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();

        }

    }

}


查看完整回答
反对 回复 2023-09-24
  • 2 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信