Home > Net >  Does one array contain any value in the other array Mongodb using c#
Does one array contain any value in the other array Mongodb using c#

Time:10-22

{
  "objects": [
    {
      "id": 123,
      "tracking_datas": [
        {
          "id": 1,
          "polygons": [1,3]
        },
        {
          "id": 2,
          "polygons": [3]
        },
        {
          "id": 3,
          "polygons": [1,2]
        }
      ]
    }
  ]
}

I have a json file as above. And there is a model that satisfies this json in my NetCore project. I want to get objects containing polygonIds that I have determined with the help of mongodb. How can I do this with c# mongo db?

For example, I have a reference array requiredPolygons: [1,2] and I want to get the data containing these polygon'ids in the tracking data of the objects in the json. The expected result is as follows.

{
  "objects":
  [
    {
      "id": 123,
      "tracking_datas":[
        {
          "id": 1,
          "polygons": [1,3]
        },
        {
          "id": 3,
          "polygons": [1,2]
        }
        ]
    }
  ]
}

CodePudding user response:

    public class Test
    {
        public ObjectId Id { get; set; }
        public IEnumerable<Object> objects { get; set; }
        [BsonExtraElements]
        public BsonDocument UnmappedFields { get; set; } // I'm not sure why it's required, something wrong with mapping configuration,
                                                         // but it's a separate question
    }

    public class Object
    {
        public int id { get; set; }
        public IEnumerable<TrackingData> tracking_datas { get; set; }
    }

    public class TrackingData
    {
        public int id { get; set; }
        public IEnumerable<int> polygons { get; set; }
        [BsonExtraElements]
        public BsonDocument UnmappedFields { get; set; } // I'm not sure why it's required, something wrong with mapping configuration,
                                                         // but it's a separate question
    }

     var json = @"{
  ""objects"": [
    {
                ""id"": 123,
      ""tracking_datas"": [
        {
                    ""id"": 1,
          ""polygons"": [1,3]
        },
        {
                    ""id"": 2,
          ""polygons"": [3]
        },
        {
                    ""id"": 3,
          ""polygons"": [1,2]
        }
      ]
    }
  ]
}";
            var client = new MongoClient();
            var db = client.GetDatabase("so_test");
            var coll = db.GetCollection<BsonDocument>("coll");

            coll.InsertOne(BsonDocument.Parse(json));

            var ids = new[] { 1, 2 };

            var typedColl = db.GetCollection<Test>("coll");
            var result = typedColl
                .Aggregate()
                .Project(p =>
                    new Test
                    {
                        Id = p.Id,
                        objects = p.objects.Select(o =>
                            new Object
                            {
                                id = o.id,
                                tracking_datas = o.tracking_datas.Where(t => t.polygons.Any(p=>ids.Contains(p)))
                            })
                    }
                )
                .ToList();

CodePudding user response:

Here you go:

db.collection.find({
  "objects.tracking_datas.polygons": {
    $in: [
      1,
      2
    ]
  }
})

https://mongoplayground.net/p/MDlIV3YPkZB

  • Related