【问题标题】:MongoDB Driver Query * Filter Definition Builder * Nin $nin Not in filterMongoDB 驱动程序查询 * 过滤器定义生成器 * Nin $nin 不在过滤器中
【发布时间】:2017-02-26 10:49:45
【问题描述】:

有没有人使用过 C# .Net MongoDB Driver FilterDefinitionBuilder's not in filter?这是我放在一起的一个简单示例,我似乎无法开始工作。假设我们必须保持集合不变。目标是仅检索不在指定 ArtistGenresDocument 列表中的 ArtistDetailsDocument。

代码将无法编译并声明“无法将 lambda 表达式转换为类型 'MongoDB.Driver.FieldDefinition ArtistDetailsDocument,ArtistGenresDocument',因为它不是委托类型”。

感谢您的帮助! \m/ \m/

public class ArtistDetailsDocument
{
    public ObjectId Id { get; set; }
    public String artist_ID { get; set; }
    public String artistName { get; set; }
}

public class ArtistGenresDocument
{
    public ObjectId Id { get; set; }
    public String artist_ID { get; set; }
    public String genre { get; set; }
}

IEnumerable<ArtistGenresDocument> list = await ArtistGenresCollection.Find(x => x.genre == "Pop" | x.genre == "Easy Listening").ToListAsync();

var filter = Builders<ArtistDetailsDocument>.Filter.Nin<ArtistGenresDocument>(x => x.artist_ID, list);

var ArtistDetailsDocuments = ArtistDetailsCollection.Find(filter);

【问题讨论】:

    标签: c# mongodb mongodb-query


    【解决方案1】:

    这里是 pieperu 帮助下的解决方案!

    IEnumerable<ArtistGenresDocument> list = await ArtistGenresCollection
        .Find(x => x.genre == "Pop" || x.genre == "Easy Listening")
        .ToListAsync();
    
    var filter = Builders<ArtistDetailsDocument>
        .Filter
        .Nin(x => x.artist_ID, list.Select(l => l.artist_ID));
    
    var ArtistDetailsDocuments = await ArtistDetailsCollection
        .Find(filter)
        .ToListAsync();
    
    public class ArtistDetailsDocument
    {
        public ObjectId Id { get; set; }
        public String artist_ID { get; set; }
        public String artistName { get; set; }
    }
    
    public class ArtistGenresDocument
    {
        public ObjectId Id { get; set; }
        public String artist_ID { get; set; }
        public String genre { get; set; }
    }
    

    【讨论】:

    • 很高兴我能帮上忙。如果我的帖子有用,也许您可​​以投票,那里可能有一些对其他人有用的信息
    【解决方案2】:

    您需要从第一个查询返回的对象集合中提取 Artist_Id,您当前正在将整个对象集合与第二个查询中的 Artist_ID 字段进行比较

    您可以在查找后使用查询中的 Project() 方法来实现此目的:

    .Project(x => x.artist_ID).ToListAsync()
    

    或者在返回结果后使用 linq

    list.Select(l => l.artist_ID)
    

    注意:我假设这里的字段 owlud 是艺术家 ID,因此您可能需要将艺术家 ID 更改为 ArtistGenresDocument 模型上的任何字段

    尝试这样的事情(我还纠正了您代码中的一些其他错误)

    IEnumerable<ArtistGenresDocument> list = await ArtistGenresCollection
        .Find(x => x.genre == "Pop" || x.genre == "Easy Listening")
        //This is where your projection would go if you didnt use linq
        //.Project(x => x.artist_ID).ToListAsync()
        .ToListAsync();
    
    var filter = Builders<ArtistDetailsDocument>
        .Filter
        //This is where we are plucking the Artist id with linq
        .Nin<ArtistGenresDocument>(x => x.artist_ID, list.Select(l => l.artist_ID));
    
    var ArtistDetailsDocuments = await ArtistDetailsCollection
        .Find(filter)
        .ToListAsync();
    

    希望对你有帮助

    【讨论】:

    • 这很有意义...谢谢。但是,当我将鼠标悬停在“x => x.artist_ID”上时,错误仍然存​​在
    • 如果您将鼠标悬停在“列表”上并检查其中的项目,您有哪些字段,正如我猜到的艺术家 ID?最新的错误是什么
    • 错误同上。我只是想通了...通过从 Not in 过滤器中删除 。我之前尝试过删除它,但在添加您的 Linq 表达式之前它没有效果。我将发布修改后的解决方案。谢谢你的帮助!!! :)
    • 当然。对不起,我应该发现这一点。这就是复制和粘贴所得到的 :) 很高兴你让它工作,如果我能提供任何帮助,我会很高兴
    猜你喜欢
    • 2018-02-04
    • 2021-11-03
    • 2015-07-12
    • 2021-03-19
    • 2015-09-08
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 2019-11-24
    相关资源
    最近更新 更多