2014-02-04 1 views
1

В MongoDB У меня есть запрос на обновление, который работает:Воссоздание позиционного оператора массива с помощью LINQ и MongoDb

db.posts.update(
    { 
    "_id" : ObjectId("..."), 
    "Comments.Reference" : 123 
    }, 
    { 
    $push : 
    { 
     "Comments.$.Notes": { Text: "Some description here" } 
    } 
    }); 

Это находит Post документ с Id соответствия и Комментарии объекта со ссылкой соответствия в этом массиве , он будет вставлять новый объект в массив Notes внутри него.

Однако, поскольку я использую C# и драйвер, я хотел посмотреть, было ли возможно создать это с помощью LINQ.

Где я падаю, создается запрос на обновление, который переводит на создание оператора $ positional.

IMongoUpdate update = Update<Post>.Push(t => t.Comments.First().Notes, 
             BsonDocument.Parse("{ Text: \"Test\"}"); 

Я поставил первый() в качестве первого приближения и получить его для компиляции, однако он выдает ошибку сказать, что он не может сериализовать его.

Возможно ли воссоздать это, или мне просто нужно вернуться к использованию строкового запроса «Комментарии.

Edit: Только для обновления, это то, что работает, но не обеспечивает безопасность типов:

IMongoUpdate update = Update.Push("Comments.$.Notes", 
            BsonDocument.Parse("{ Text: \"Test\"}"); 
+0

Не могли бы вы поделиться C# для Post вашего класса? Прошло некоторое время с тех пор, как я использовал драйвер Mongo C#, но я постараюсь помочь, если смогу :) – Jordan

+1

https://jira.mongodb.org/browse/CSHARP-531 – Jordan

+0

Отличная находка! Я считаю, что так хорошо, как ответ на данный момент Мартина, в настоящее время он не поддерживается. Хотите продвинуть этот комментарий в ответ, и я пометю его как «Принято»? – Kasaku

ответ

3

Эта функциональность была добавлена:

https://jira.mongodb.org/browse/CSHARP-1046

Чтобы скопировать непосредственно из корпуса JIRA:

Builders<Entity>.Update.Set(x => x.MyArray[-1].Value, 10); 

даст

{ $set: { "MyArray.$.Value", 10 } }