如何自动为MongoDB的儿童创建objectid



我有一个创建JObject的服务1。然后,我有Service2将该验证插入Mongo db。

服务1

var doc = GetDocument();
var jDoc = new JObject(
                    new JProperty("_id", doc.DocumentID),
                    new JProperty("url", doc.DocumentLink),                   
                    new JProperty("cost", null),
                    new JProperty("context", new JObject(
                        new JProperty("endTime", null),
                        new JProperty("startTime", doc.DocumentCreated))),                   
                    new JProperty("tasks", new JObject(
                        new JProperty("phase", "completed"),                        
                        new JProperty("initialTask", new JObject(                              
                                new JProperty("name",doc.DocumentName),
                                new JProperty("input", "someinput"))))));

然后即时通讯将其传递到Service2,将其插入MongoDB

服务2

     public async Task Create(JObject jDoc)
     {
            var collection = _mongoDatabase.GetCollection<BsonDocument>("units");
            var bDoc = BsonDocument.Parse(jDoc.ToString());
            await collection.InsertOneAsync(bDoc);
        }
    }

service1为根文档元素创建_id。我期望Service2将文档插入MongoDB时,它将自动为contexttasksinitialTask等儿童属性创建_id,但是它不会为儿童创建_id

问题
1>如何为所有孩子自动创建_id
2>如果我们无法自动创建_id,并且只有选项是创建_id是Service1,那么我们可以在Service1中创建ObjectID,而无需引用MongoDB.Deriver。请注意,只有Service2参考MongoDB.Driver。Service1没有引用MongoDB.Driver。我想要以下格式的孩子的_id

"_id" : ObjectId("559b3cc8bf13a6740d7d50b0")

而无需使用文档对象作为参数,我没有找到您的问题解决方案。

1)如果您在文档对象中使用属性上的属性,则可以自动生成_id的CC_15。您可以避免使用带有属性的通用接口或包装程序类引用Service1中的MongoDB库。如果这不吸引您,则可以尝试使用SetOnInsert;但是,这再次要求您将有关JObject结构的信息传递给Create方法。

2)如果您仍然要使用JObject,则可以使用查找/替换(可能使用正则延期)或为_id属性创建自定义数据类型并创建自定义序列化器。以下确实可以按预期工作:

string json = "{ "_id" : ObjectId("559b3cc8bf13a6740d7d50b0") }";
BsonDocument bDoc = BsonDocument.Parse(json);

相关内容

  • 没有找到相关文章

最新更新