#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);