Paul
Paul

Reputation: 13

MongoDB linq C# select document where array of subdocumnets contain all values from string array

I have a collection on MongoDb with a similar stricture to the object below.

{
    _id: ObjectId("0000000"),
    groupName: "Group A",
    users[
        {
            userId: "1111111",
            rollDescription: "Some Text Here"
        },
        {
            userId: "2222222",
            rollDescription: "Some Text Here"
        },
        {
            userId: "3333333",
            rollDescription: "Some Text Here"
        }
    ]
}

Elsewhere in the system an array of "userIds" is generated and I need to select all groups that contain all userIds in the array.

Is it possible to do this using just linq?

I know I can use this if I had just an array of userIds:

from g in groups.AsQueryable<Group>() where g.Users.ContainsAll(usersIds.ToArray()) select g;

Is there something similar for querying an array of subdocumnets instead of an array of strings?

Upvotes: 1

Views: 1910

Answers (1)

Jason Fry
Jason Fry

Reputation: 1234

Here's how I'd do it in a MongoDB query:

db.collection.find({ "users.userId": { $all: [ "1111111", "2222222", "3333333" ] }})

I think LINQ will be quite a bit trickier. Does this work (I don't have MongoDB installed)?

from g in groups.AsQueryable<Group>() where g.Users.ConvertAll(u => g.UserId).AsQueryable().ContainsAll(userIds) select g;

Even if it did I suspect that it will not be as performant as using the MongoDB query builder:

groups.Find(Query.All("users.userId", userIds))

Upvotes: 1

Related Questions