2016-07-06 2 views
0

У меня есть документ, как это:Query/Найти Вернуться JSON объект в BsonDocument

{ "File" : "xxxxxxx.txt", 
     "Content" : [ 
      { "tag" : "Book", 
       "name" : "TestBook1", 
       "value" : "xxx" 
      }, 
      { "tag" : "Dept", 
       "name" : "TestDept1", 
       "value" : "yyy" 
      }, 
      { "tag" : "Employee", 
       "name" : "TestEmployee1", 
       "value" : "zzz" 
      }] 
    } 

я могу найти документ с помощью:

var filter = Builders<BsonDocument>.Filter.Eq("Content.tag", "Dept"); 
var result = collection.Find(filter).ToList(); 

Однако, это возвращает весь документ. Есть ли способ получить объект JSON ({"tag" : "Dept", "name" : "TestDept1"})?

То, что я пытаюсь получить, это просто свойство «значение» (в данном случае это «yyy»), а не весь документ.

UPDATE:

Как Фани предложил, я был в состоянии сделать эту работу со следующим кодом:

var subFilter = Builders<BsonDocument>.Filter.Eq("tag", "Dept"); 
var filter = Builders<BsonDocument>.Filter.ElemMatch("Content", subFilter); 
var result = 
    collection.Find(filter) 
     .Project(Builders<BsonDocument>.Projection.Exclude("_id").Include("Content.$")) 
     .ToList(); 

ответ

2

Вы должны использовать проекцию ElemMatch для этого.

Запрос оболочки для этого: db.testing.find ({Content: {$ elemMatch: {"tag": "Dept"}}}, {"_ id": 0, "Content. $": 1})

C# запрос будет

Find(x => x.Content.Any(p => p.tag == "Dept")).Project(Builders<BsonDocument>.Projection.Exclude("_id").Include("Content.$")).ToList();

Пожалуйста, проверьте, если это работает.

+0

Phani, спасибо за ответ. К сожалению, у меня не может быть класса POCO для моего JSON, потому что структура объекта в Контенте динамична. Я использую структуру fix только для простоты. Есть ли способ не использовать класс POCO в LINQ, чтобы сделать эту работу? – notlkk

+0

Phani, я смог использовать .Project, как вы предложили в сочетании с фильтром, чтобы включать только объект Content. Однако это возвращает весь объект Content. Есть ли способ дальнейшего фильтрации результата, поэтому он содержит только часть Dept в Контенте? – notlkk

+0

Phani, еще раз спасибо за ваш ответ. Кажется, я понял. Я обновлю свой пост и приму свой ответ. – notlkk