MongoDB C#驱动程序是否支持这种方式的Join?

时间:2018-07-10 16:38:04

标签: c# mongodb mongodb-.net-driver

我有两个班PersonAnimal

using System;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
namespace MongoTesting.Documents
{
    public class Person
    {
        [BsonId]
        [BsonRepresentation(BsonType.String)]
        public Guid PersonId { get; set; } = Guid.NewGuid();

        public Guid PetId { get; set; } = Guid.Empty;

        public string Name { get; set; } = "Person";
    }
}

using System;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
namespace MongoTesting.Documents
{
    public class Animal
    {
        [BsonId]
        [BsonRepresentation(BsonType.String)]
        public Guid AnimalId { get; set; } = Guid.NewGuid();

        public bool IsMammal { get; set; }

        public string Description { get; set; } = "Animal";
    }
}

哪些序列化为IMongoCollection s

public IMongoCollection<Person> PersonCollection { get; set; }
public IMongoCollection<Animal> AnimalCollection { get; set; }
...
PersonCollection = Database.GetCollection<Person>("PersonCollection");
AnimalCollection = Database.GetCollection<Animal>("AnimalCollection");

使用C#2.7.0 MongoDB .Net驱动程序和MongoDB 3.4 mongod服务器守护程序。

鉴于此设置,我正在尝试编写一种特定类型的查询,特别是下面的SSCCE中的查询

using System;
using System.Linq;
using System.Collections.Generic;

using MongoTesting.Documents;
using MongoTesting.DatabaseInterface;

using MongoDB.Driver;

namespace MongoTesting
{
    class Program
    {
        static void Main(string[] args)
        {
            MongoInterface _mongo = new MongoInterface();
            _mongo.Open();

            //CreateDocuments(_mongo);
            Console.Out.WriteLine("Total Persons: " + _mongo.PersonCollection.CountDocuments(Builders<Person>.Filter.Empty));
            Console.Out.WriteLine("Total Animals: " + _mongo.AnimalCollection.CountDocuments(Builders<Animal>.Filter.Empty));

            var peopleWithMammalianPetsQuery =
                from person in _mongo.PersonCollection.AsQueryable()
                join animal in _mongo.AnimalCollection.AsQueryable() on person.PetId equals animal.AnimalId
                where animal.IsMammal
                select person;

            var peopleWithMammalianPets = peopleWithMammalianPetsQuery.ToList();
            peopleWithMammalianPets.ForEach(person => { Console.Out.WriteLine("Person: " + person.Name); });

            Console.ReadLine();
        }

        public static void CreateDocuments(MongoInterface _mongo)
        {
            Animal dog = new Animal() { IsMammal = true, Description = "Dog" };
            Animal cat = new Animal() { IsMammal = true, Description = "Cat" };
            Animal bird = new Animal() { IsMammal = false, Description = "Bird" };
            Animal snake = new Animal() { IsMammal = false, Description = "Snake" };

            Person bob = new Person() { PetId = dog.AnimalId, Name = "Bob" };
            Person sue = new Person() { PetId = cat.AnimalId, Name = "Sue" };
            Person sam = new Person() { PetId = bird.AnimalId, Name = "Sam" };
            Person eve = new Person() { PetId = snake.AnimalId, Name = "Eve" };

            _mongo.PersonCollection.InsertMany(new List<Person>() { bob, sue, sam, eve });
            _mongo.AnimalCollection.InsertMany(new List<Animal>() { dog, cat, bird, snake });
        }
    }
}

MongoInterface代表一个可以连接到MongoDB服务器,访问IMongoDatabase并操纵PersonCollectionAnimalCollection的类。


我上面代码的具体问题是,在运行peopleWithMammalianPetsQuery时,运行时抛出了以下异常。

  

“ System.NotSupportedException”类型的未处理异常发生在   MongoDB.Driver.dll   附加信息:$ project或$ group不支持{document}。

我已经四处搜寻,但找不到与该问题完全相同并能解决的问题。关于异常消息的报告很多,尽管它们在产生它的用法上似乎都不同(甚至有些似乎已得到修复)。我还看到了许多帖子,它们显示了非常相似的代码(特别是join),没有问题。

如何执行上述查询?

0 个答案:

没有答案