繁体   English   中英

如何使用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字段中的值。

我想念什么?

更新中的美元符号的解释方式与在Aggregation Framework中不同。 这里是旧的stackoverflow线程。

作为解决方法,您可以使用$ 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();
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM