Таким образом, ключевым моментом здесь является оператор $ unwind , который преобразует массив из n
элементов в n
элементов с одним вложенным документом.
db.createView(
"yourview",
"yourcollection",
[ { $unwind: "$books" } ]
)
Это даст вам документы в следующем формате:
{ author: "aa", books: { title: "a", pages: 100 } },
{ author: "aa", books: { title: "b", pages: 200 } },
{ author: "ab", books: { title: "c", pages: 80 } },
{ author: "ab", books: { title: "d", pages: 150 } }
РЕДАКТИРОВАТЬ: чтобы иметь ключи с точками в именах, вы можете запустить команду:
db.createView(
"yourview",
"yourcollection",
[
{ $unwind: "$books" },
{
$project: {
author: 1,
books2: {
$map: {
input: { $objectToArray: "$books" },
as: "book",
in: {
k: { $concat: [ "books.", "$book.k" ] },
v: "$book.v"
}
}
}
}
},
{
$replaceRoot: {
newRoot: { $mergeObjects: [ { author: "$author" }, { $arrayToObject: "$books2" } ] }
}
}
]
)
В основном он использует $ objectToArray и $ arrayToObject , чтобы «заставить» MongoDB возвращать поля с точками в именах. Выходы:
{ "author" : "aa", "books.title" : "a", "books.pages" : 100 }
{ "author" : "aa", "books.title" : "b", "books.pages" : 200 }
{ "author" : "ab", "books.title" : "c", "books.pages" : 80 }
{ "author" : "ab", "books.title" : "d", "books.pages" : 150 }
В конце я решил использовать класс JavaScriptSerializer для преобразования DataTable в строку JSON. К сожалению, этот класс не работает с DataTable, таким образом, я преобразовал DataTable в список словарей, и передайте тот список классу JavaScriptSerializer. Требуется только несколько строк кода, и это хорошо работает.
Пример в VB.net:
Public Function GetJson(ByVal dt As DataTable) As String
Dim serializer As System.Web.Script.Serialization.JavaScriptSerializer = New System.Web.Script.Serialization.JavaScriptSerializer()
Dim rows As New List(Of Dictionary(Of String, Object))
Dim row As Dictionary(Of String, Object)
For Each dr As DataRow In dt.Rows
row = New Dictionary(Of String, Object)
For Each col As DataColumn In dt.Columns
row.Add(col.ColumnName, dr(col))
Next
rows.Add(row)
Next
Return serializer.Serialize(rows)
End Function
Я должен признать, что чрезвычайно не удивлен - DataTable
в основном нарушает большинство правил структурированных данных. Почему не просто проект из таблицы данных в типизированный объект? Связанный вопрос подошел ранее... или если Вы знаете схему DataTable
просто сделайте преобразование в C#...
Вручную создание JSON могло бы работать, но существует много пограничных случаев для предотвращения; я скорее позволил существующей платформе обработать его, быть честной.
.Net 3.5 имеет JSONSerializer, который должен смочь обработать таблицу данных. Можно хотеть посмотреть к Вашим услугам код снова и попытаться заставить это использовать это. Кроме того, я соединил некоторый код, чтобы сделать это вручную в этом вопросе.
Json.NET имеет способность записать Наборы данных/Таблицы данных в JSON.
http://james.newtonking.com/archive/2008/09/06/dataset-datatable-serialization-with-json-net.aspx
Как Marc, я также не удивлен, что DataTable повреждает Ваш обмен webservice/json. Я хотел бы подтвердить Json.NET также.
Но если Вы решаете не пойти с ним, Вы все еще не должны создавать json вручную. Просто сделайте свой собственный минимизированный пользовательский класс со всеми свойствами, Вы нуждаетесь и затем возвращаете массив того класса. Необходимо будет, конечно, написать код для "преобразовывания" таблицы данных в новый класс. Я знаю, это могла быть большая запись кода, но это намного менее подвержено ошибкам затем попытка вручную сделать строку json.