skip to Main Content
{
  "isbn": "123-456-222",
  "author": {
    "_id": 1,
    "lastname": "Doe",
    "firstname": "Jane"
  },
  "editor": [
    {
      "_id": 1,
      "lastname": "Smith",
      "firstname": "Jane"
    },
    {
      "_id": 2,
      "lastname": "Lopez",
      "firstname": "Jennifer"
    }
  ],
  "title": "The Ultimate Database Study Guide",
  "category": [
    "Non-Fiction",
    "Technology"
  ]
}

I am using the MongoDB database and MongoDB .NET driver library in .NET Core. I can search by isbn, but I want to find all books with editor firstname: Jane, lastname: Smith and firstname: Jennifer, lastname: Lopez. How can I do that?

2

Answers


  1. I don’t know C#/.NET, but here’s a query that you may be able to translate to retrieve the documents you want.

    db.collection.find({
      "$and": [
        {
          "editor": {
            "$elemMatch": {
              "lastname": "Smith",
              "firstname": "Jane"
            }
          }
        },
        {
          "editor": {
            "$elemMatch": {
              "lastname": "Lopez",
              "firstname": "Jennifer"
            }
          }
        }
      ]
    })
    

    Try it on mongoplayground.net.

    Login or Signup to reply.
  2. @rickhg12hs provided the correct filter in the MongoDB query.

    To convert it into MongoDB .NET Driver syntax:

    Assume that you have these model classes for your collection:

    internal class Book
    {
        [BsonId]
        public ObjectId Id { get; set; }
    
        [BsonElement("isbn")]
        public string Isbn { get; set; }
    
        [BsonElement("author")]
        public Author Author { get; set; }
    
        [BsonElement("editor")]
        public Editor[] Editor { get; set; }
    
        [BsonElement("title")]
        public string Title { get; set; }
    
        [BsonElement("category")]
        public string[] Category { get; set; }
    }
    
    internal class Author: People
    {
    
    }
    
    internal class Editor : People
    {
    
    }
    
    internal class People
    {
        [BsonElement("_id")]
        public int Id { get; set; }
    
        [BsonElement("lastname")]
        public string LastName { get; set; }
    
        [BsonElement("firstname")]
        public string FirstName { get; set; }
    }
    
    FilterDefinition<Book> filter = Builders<Book>.Filter.Empty;
    
    filter &= Builders<Book>.Filter.ElemMatch(x => x.Editor,
        Builders<Editor>.Filter.And(
            Builders<Editor>.Filter.Eq(y => y.FirstName, "Jane"),
            Builders<Editor>.Filter.Eq(y => y.LastName, "Smith")
        )
    );
    
    filter &= Builders<Book>.Filter.ElemMatch(x => x.Editor,
        Builders<Editor>.Filter.And(
            Builders<Editor>.Filter.Eq(y => y.FirstName, "Jennifer"),
            Builders<Editor>.Filter.Eq(y => y.LastName, "Lopez")
        )
    );
    
    List<Book> books = (await _mongoCollection.FindAsync(filter))
        .ToList();
    

    enter image description here

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search