<!-- 
RSS generated by JIRA (9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66) at Wed Feb 07 21:40:38 UTC 2024

It is possible to restrict the fields that are returned in this document by specifying the 'field' parameter in your request.
For example, to request only the issue key and summary append 'field=key&field=summary' to the URL of your request.
-->
<rss version="0.92" >
<channel>
    <title>MongoDB Jira</title>
    <link>https://jira.mongodb.org</link>
    <description>This file is an XML representation of an issue</description>
    <language>en-us</language>    <build-info>
        <version>9.7.1</version>
        <build-number>970001</build-number>
        <build-date>13-04-2023</build-date>
    </build-info>


<item>
            <title>[CSHARP-1768] Projection of mongodb BsonId using C# .NET driver 2.2.4</title>
                <link>https://jira.mongodb.org/browse/CSHARP-1768</link>
                <project id="10041" key="CSHARP">C# Driver</project>
                    <description>&lt;p&gt;I have the following structure:&lt;/p&gt;

&lt;p&gt;        public abstract class DbEntity&lt;br/&gt;
    {&lt;br/&gt;
        &lt;span class=&quot;error&quot;&gt;&amp;#91;BsonId&amp;#93;&lt;/span&gt;&lt;br/&gt;
        public ObjectId Id &lt;/p&gt;
{ get; set; }&lt;br/&gt;
&lt;br/&gt;
        &lt;span class=&quot;error&quot;&gt;&amp;#91;BsonDateTimeOptions(Kind = DateTimeKind.Utc)&amp;#93;&lt;/span&gt;&lt;br/&gt;
        public DateTime CreatedAt { get; set; }

&lt;p&gt;        &lt;span class=&quot;error&quot;&gt;&amp;#91;BsonDateTimeOptions(Kind = DateTimeKind.Utc)&amp;#93;&lt;/span&gt;&lt;br/&gt;
        public DateTime ModifiedAt &lt;/p&gt;
{ get; set; }&lt;br/&gt;
&lt;br/&gt;
        &lt;span class=&quot;error&quot;&gt;&amp;#91;BsonDefaultValue(EntityState.Active)&amp;#93;&lt;/span&gt;        &lt;br/&gt;
        public EntityState State { get; set; }

&lt;p&gt;        &lt;span class=&quot;error&quot;&gt;&amp;#91;BsonIgnoreIfNull&amp;#93;&lt;/span&gt;&lt;br/&gt;
        &lt;span class=&quot;error&quot;&gt;&amp;#91;BsonDateTimeOptions(Kind = DateTimeKind.Utc)&amp;#93;&lt;/span&gt;&lt;br/&gt;
        public DateTime? DeletedOn &lt;/p&gt;
{ get; set; }&lt;br/&gt;
    }&lt;br/&gt;
&lt;br/&gt;
&lt;br/&gt;
        public class Post : DbEntity&lt;br/&gt;
    {&lt;br/&gt;
        public ObjectId UserId { get; set; }

&lt;p&gt;        public string SourceUrl &lt;/p&gt;
{ get; set; }&lt;br/&gt;
&lt;br/&gt;
        public Guid? PictureId { get; set; }

&lt;p&gt;        public PostType Type &lt;/p&gt;
{ get; set; }&lt;br/&gt;
&lt;br/&gt;
        public string Caption { get; set; }

&lt;p&gt;        public GeoJsonPoint&amp;lt;GeoJson2DGeographicCoordinates&amp;gt; Location &lt;/p&gt;
{ get; set; }&lt;br/&gt;
&lt;br/&gt;
        public string LocationName { get; set; }

&lt;p&gt;        public List&amp;lt;ObjectId&amp;gt; TaggedFriends &lt;/p&gt;
{ get; set; }&lt;br/&gt;
&lt;br/&gt;
        public List&amp;lt;string&amp;gt; Tags { get; set; }

&lt;p&gt;        public List&amp;lt;string&amp;gt; GearTags &lt;/p&gt;
{ get; set; }&lt;br/&gt;
&lt;br/&gt;
        public Activity Activity { get; set; }

&lt;p&gt;        public int LikesAmount &lt;/p&gt;
{ get; set; }&lt;br/&gt;
&lt;br/&gt;
        public int CommentsAmount { get; set; }

&lt;p&gt;        public List&amp;lt;SharingTarget&amp;gt; Shared &lt;/p&gt;
{ get; set; }&lt;br/&gt;
&lt;br/&gt;
        public List&amp;lt;string&amp;gt; SearchTokens&lt;br/&gt;
        {&lt;br/&gt;
            get&lt;br/&gt;
            {
                var result = new List&amp;lt;string&amp;gt;();
                result.AddRange(Caption.GetTokens());
                result.AddRange(Tags);
                result.AddRange(GearTags);
                result.AddRange(LocationName.GetTokens());
                return result;
            }&lt;br/&gt;
            set { }&lt;br/&gt;
        }&lt;br/&gt;
    }&lt;br/&gt;
&lt;br/&gt;
            private class AggregatedPost : Followings&lt;br/&gt;
        {&lt;br/&gt;
            public AggregatedPost(ObjectId ownerId) : base(ownerId)&lt;br/&gt;
            {&lt;br/&gt;
            }&lt;br/&gt;
&lt;br/&gt;
            public List&amp;lt;Post&amp;gt; Posts { get; set; }
&lt;p&gt;        }&lt;/p&gt;

&lt;p&gt;        private class UnwindPost : Followings&lt;br/&gt;
        {&lt;br/&gt;
            public UnwindPost(ObjectId ownerId) : base(ownerId)&lt;br/&gt;
            {&lt;br/&gt;
            }&lt;/p&gt;

&lt;p&gt;            public Post Posts &lt;/p&gt;
{ get; set; }
&lt;p&gt;        }&lt;/p&gt;

&lt;p&gt;I run the query where as a projection I use an Expression `&amp;lt;Func&amp;lt;UnwindPost,Post&amp;gt;&amp;gt;`&lt;/p&gt;



&lt;p&gt;                              var query = await&lt;br/&gt;
                    followingsCollection.Aggregate()&lt;br/&gt;
                    .Match(Builders&amp;lt;Followings&amp;gt;.Filter.Where(v =&amp;gt; v.Id == userId))&lt;br/&gt;
                    .Unwind&amp;lt;Followings&amp;gt;(new ExpressionFieldDefinition&amp;lt;Followings&amp;gt;(LocalFollowingFieldName))&lt;br/&gt;
                    .Lookup(postCollection, new ExpressionFieldDefinition&amp;lt;Followings&amp;gt;(LocalFollowingFieldName), new ExpressionFieldDefinition&amp;lt;Post&amp;gt;(ForeignPostFieldName),&lt;br/&gt;
                    new ExpressionFieldDefinition&amp;lt;AggregatedPost&amp;gt;(AggregatedPostAliasFieldName))&lt;br/&gt;
                            .Unwind&amp;lt;UnwindPost&amp;gt;(new ExpressionFieldDefinition&amp;lt;AggregatedPost&amp;gt;(UnwindPostFieldName))&lt;br/&gt;
                                .Limit(pageInfo.Take)&lt;br/&gt;
                                .Skip(pageInfo.Skip)&lt;br/&gt;
                                .Project(v =&amp;gt; new Post&lt;br/&gt;
                                &lt;/p&gt;
{
                                    Id = v.Posts.Id,
                                    UserId = v.Posts.UserId,
                                    CreatedAt = v.Posts.CreatedAt,
                                    SourceUrl = v.Posts.SourceUrl,
                                    Type = v.Posts.Type,
                                    Caption = v.Posts.Caption,
                                    Activity = v.Posts.Activity,
                                    LocationName = v.Posts.LocationName,
                                    LikesAmount = v.Posts.LikesAmount,
                                    CommentsAmount = v.Posts.CommentsAmount,
                                    PictureId = v.Posts.PictureId
                                }
&lt;p&gt;).ToListAsync();&lt;/p&gt;

&lt;p&gt;As a result I have an exception that says&lt;br/&gt;
Element &apos;Id&apos; does not match any field or property of class.&lt;br/&gt;
If I run this query on mongodb, it returns the next record: &lt;/p&gt;

&lt;p&gt;` Id: ObjectId(&quot;57d91c5393846c3c14792522&quot;)&lt;br/&gt;
 UserId: ObjectId(&quot;57d91c5293846c3c14792512&quot;)&lt;br/&gt;
 CreatedAt: 09/14/2016 12:45:55 PM (+0300)&lt;br/&gt;
 SourceUrl: &quot;test url&quot;&lt;br/&gt;
 Type: 0&lt;br/&gt;
 Caption: &quot;Test1&quot;&lt;br/&gt;
 Activity: NULL&lt;br/&gt;
 LocationName: &quot;TestLocationName&quot;&lt;br/&gt;
 LikesAmount: 0&lt;br/&gt;
 CommentsAmount: 0&lt;br/&gt;
 PictureId: NULL`&lt;/p&gt;

&lt;p&gt;As you may see, there is no field &apos;_id&apos; here, however id is returned as &apos;Id&apos;. All my records are stored in mongodb with &apos;_id&apos; field.&lt;/p&gt;

&lt;p&gt;How can I project the record with &apos;_id&apos; field in mongo syntax that will be mapped correctly to my Post class (preferably using projection that has Expression as an argument)?&lt;/p&gt;

</description>
                <environment></environment>
        <key id="316106">CSHARP-1768</key>
            <summary>Projection of mongodb BsonId using C# .NET driver 2.2.4</summary>
                <type id="1" iconUrl="https://jira.mongodb.org/secure/viewavatar?size=xsmall&amp;avatarId=14703&amp;avatarType=issuetype">Bug</type>
                                            <priority id="3" iconUrl="https://jira.mongodb.org/images/icons/priorities/major.svg">Major - P3</priority>
                        <status id="6" iconUrl="https://jira.mongodb.org/images/icons/statuses/closed.png" description="The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.">Closed</status>
                    <statusCategory id="3" key="done" colorName="success"/>
                                    <resolution id="9">Done</resolution>
                                        <assignee username="-1">Unassigned</assignee>
                                    <reporter username="ymota">Yaroslav Mota</reporter>
                        <labels>
                    </labels>
                <created>Wed, 14 Sep 2016 10:04:01 +0000</created>
                <updated>Tue, 7 Feb 2017 17:30:01 +0000</updated>
                            <resolved>Tue, 7 Feb 2017 17:30:01 +0000</resolved>
                                    <version>2.2.4</version>
                                                    <component>Serialization</component>
                                        <votes>1</votes>
                                    <watches>3</watches>
                                                                                                                <comments>
                            <comment id="1395860" author="craiggwilson" created="Wed, 28 Sep 2016 17:36:47 +0000"  >&lt;p&gt;Hi Yaroslav,&lt;/p&gt;

&lt;p&gt;This should be fixed in 2.3.0. Could you please test this and let us know the results?&lt;/p&gt;

&lt;p&gt;Craig&lt;/p&gt;</comment>
                    </comments>
                    <attachments>
                    </attachments>
                <subtasks>
                    </subtasks>
                <customfields>
                                                                                                                                                                                                                                                                                                                                                                    <customfield id="customfield_15850" key="com.atlassian.jira.plugins.jira-development-integration-plugin:devsummary">
                        <customfieldname>Development</customfieldname>
                        <customfieldvalues>
                            
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    <customfield id="customfield_12550" key="com.pyxis.greenhopper.jira:gh-lexo-rank">
                        <customfieldname>Rank</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>2|hspq5b:</customfieldvalue>

                        </customfieldvalues>
                    </customfield>
                                                                <customfield id="customfield_10558" key="com.pyxis.greenhopper.jira:gh-global-rank">
                        <customfieldname>Rank (Obsolete)</customfieldname>
                        <customfieldvalues>
                            <customfieldvalue>9223372036854775807</customfieldvalue>
                        </customfieldvalues>
                    </customfield>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            </customfields>
    </item>
</channel>
</rss>