Как запросить словарь в документе Mongo?

#c# #mongodb #mongodb-query

#c# #mongodb #mongodb-запрос

Вопрос:

У меня есть документ, показанный ниже

Это моя структура C # для этого документа

 public class MetaData
{
  [BsonId]
  public ObjectId _Id { get; set; }
  [BsonElement("User")]
  public IDictionary<Int64, FirstUser> User { get; set; }
}

public class FirstUser
{
    [BsonElement("Name")]
    public String Name { get; set; }
    [BsonElement("Id")]
    public Int64 Id { get; set; }
}
  

Это моя структура BSON для этого документа

 /* 1 */
{
    "_id" : ObjectId("5805c1ced520b54bd4192214"),
    "User" : [ 
        [ 
            NumberLong(1), 
            {
                "Name" : "FirstUser",
                "_id" : NumberLong(1)
            }
        ]
    ]
}

/* 2 */
{
    "_id" : ObjectId("5805c1ced520b54bd4192215"),
    "User" : [ 
        [ 
            NumberLong(1), 
            {
                "Name" : "SecondUser",
                "_id" : NumberLong(2)
            }
        ]
    ]
}


/* 3 */
{
    "_id" : ObjectId("5805c1ced520b54bd4192216"),
    "User" : [ 
        [ 
            NumberLong(1), 
            {
                "Name" : "ThirdUser",
                "_id" : NumberLong(3)
            }
        ]
    ]
}


/* 4 */
{
    "_id" : ObjectId("5805c1ced520b54bd4192217"),
    "User" : [ 
        [ 
            NumberLong(1), 
            {
                "Name" : "FourthUser",
                "_id" : NumberLong(2)
            }
        ]
    ]
}
  

Мне нужны все документы, которые имеют «Name» как «FirstUser», для этого, как мне сформировать ЗАПРОС MONGO?

Комментарии:

1. Ваша схема BSON и ваши классы, похоже, не совпадают… похоже, что ваш BSON имеет «User» как массив массива объектов, а не только словарь.

2. Могу ли я предложить вам использовать Aggregation Framework для его решения? Если да, я могу написать вам ответ.

3. Я уже устал от того, что он работает, но проблема здесь в том, что я не могу получить более 16 МБ. Иногда мне приходится извлекать более 16 МБ.

Ответ №1:

Проблема здесь в том, что ваши ключи словаря — это числа. Обычно вы используете что-то вроде "User.1.Name": "FirstUser" , но этот синтаксис на самом деле делает что-то другое: ищет второй элемент, в User котором есть Name=FirstUser (потому что индексация основана на нуле).

Если у вас есть только один ключ User , вы можете использовать "User.0.Name": "FirstUser" .

Комментарии:

1. Это работает, но проблема здесь в том, что пользователь может быть любым, где мы не можем сказать, что он всегда стоит первым в словаре.

2. Можете ли вы привести пример для вашей схемы, когда это так?

Ответ №2:

Вы можете сделать это из оболочки mongo, используя следующее:

 db.collection.find({'User.Name': 'FirstUser'});
  

Или из драйвера c # вы можете сделать следующее:

 var c = await wat.FindAsync(x => x.User[0].Name == "FirstUser");
var metaData = await c.ToListAsync();
  

Комментарии:

1. на самом деле мне нужен запрос mongo, потому что сначала я делаю запрос, а затем пытаюсь получить документ. Как сделать make для этого

Ответ №3:

 Here is on example that works for me:

`var query = new Dictionary<string, object>()`
            {
                { "$match", new { id = 11 }}
             };`

 
var result = services.Query<objectType>(query);