首页 后端开发 XML/RSS教程 调用API生成RSS资源文件的实例详解

调用API生成RSS资源文件的实例详解

May 05, 2017 am 09:49 AM

C#调用新浪微博API生成RSS资源文件(源文件Demo) 

新浪微博现在好像势头很猛,很多人在创立自己的微博客的时候,开始出于好奇,都会跟随很多人,久而久之,自己的好友人数超过100后,那么你就发现,你已经完全淹没在信息的洪流中了,你跟随了那么多人,很多人都是今后可能永远都不会想起,也永远也不会看到的人,这显然与“关注”的目的是相背的,更有时候可能你只是想看下你认识的人的消息更新了没有,但是显然你不可能每次都一个个到自己的关注人物表中点开然后再一一访问他的主页,这样操作太繁琐了。

用过RSS阅读器的用户可能都体会到RSS阅读器在获取信息的优越性了吧。它能实时跟踪RSS资源的更新,并显示更新数目到指定的订阅资源后面,可以让用户有针对性地查看信息,让用户主动地去获取信息,而不再是被动地接受信息了,这对于解决微博的“信息洪流”问题是很有效的。

笔者花费了几天时间,终于写了一个程序,用于获取指定用户的好友,并存储备份到ACCESS数据库中,然后生成一个RSS阅读资源。不敢独享,所以开源和大家分享。今后如果有时间,我想再将它做成一个桌面软件,方便一般不懂程序的用户来操作,这都是后话了吧。

1. 新浪微博RSS订阅第三方网站

新浪微博本身没有提供RSS订阅,但是到网上搜索,发现了一个第三方的网站,提供新浪微博的RSS资源,所以,本文的RSS订阅说白了都是基于这个第三方网站的。

log.medcl.net/item/2010/02/sina-bo-rss-subscribe-feed-generate-micro/

2. 网上通用的OPML文件的XML格式

下面是从Google Reader中导出的opml文件,这是网络RSS阅读器甚至所有RSS阅读器的标准格式吧,至少“鲜果”,“有道”这些比较流行的在线阅读器都支持这个格式的文件导入。

<?xml version="1.0" encoding="UTF-8"?><opml version="1.0">
	<head>
		<title>subscriptions</title>
		<dateCreated>2010-05-16 15:45:03</dateCreated>
		<ownerName></ownerName>
	</head>
	<body>
		<outline text="微博客" title="微博客">			
			<outline text="冷笑话(1567852087)" 
				title="冷笑话(1567852087)" type="rss"
				htmlUrl="http://t.sina.com.cn/1567852087" 
				xmlUrl="http://medcl.net/SinaRss.aspx?uid=1567852087" />
			<outline text="后宫优雅(1665289110)" 
				title="后宫优雅(1665289110)" type="rss"
				htmlUrl="http://t.sina.com.cn/1665289110" 
				xmlUrl="http://medcl.net/SinaRss.aspx?uid=1665289110" />
			<outline text="围脖经典语录" 
				title="围脖经典语录" type="rss"
				htmlUrl="http://t.sina.com.cn/1646465281" 
				xmlUrl="http://medcl.net/SinaRss.aspx?uid=1646465281" />			
			<outline text="破阵子(1644022141)" 
				title="破阵子(1644022141)" type="rss"
				htmlUrl="http://t.sina.com.cn/1644022141" 
				xmlUrl="http://medcl.net/SinaRss.aspx?uid=1644022141" />			
		</outline>
		<outline text="珞珈山水" title="珞珈山水">			
			<outline text="今日十大热门话题" 
				title="今日十大热门话题" type="rss"
				htmlUrl="http://bbs.whu.edu.cn/frames.html" 
				xmlUrl="http://bbs.whu.edu.cn/rssi.php?h=1" />			
			<outline text="贴图版" 
				title="贴图版" type="rss"
				htmlUrl="http://bbs.whu.edu.cn/wForum/board.php?name=Picture" 
				xmlUrl="http://bbs.whu.edu.cn/wForum/rss.php?board=Picture&amp;ic=1" />
		</outline>
	</body></opml>
登录后复制

分析OPML文件的架构,然后方便通过程序来将它需要的信息写成此架构的文件,便于阅读器引用。 OPML文件由头部标签(主要是本文件的一些注释,不影响实际的RSS订阅信息,不是太重要)和(RSS阅读器提取订阅资源的全部数据来源)。在节点下面有个一级的节点,这个节点对应RSS阅读器中地RSS资源的分类文件夹相关信息(显然text表示的就是文件夹名称),然后一级下面就是二级的标签对,这里面就是RSS资源的相关数据内容了。二级中的节点的一些重要属性:text表示资源的标题,htmlUrl表示的是信息的的Web网页地址,xmlUrl表示的是信息的RSS订阅地址。

3. 新浪微博API――从服务器上导出用户好友数据到本地XML文件

关于新浪微博API的详细介绍,可以参考新浪微博API官方网站:

open.t.sina.com.cn/wiki/index.php/首页

关于身份认证和数据请求,请参考cnblogs:

《.NET调用新浪微博开放平台接口的代码示例》

www.cnblogs.com/cmt/archive/2010/05/13/1733904.html

下面是自己整理的代码,从服务器上请求用户的好友信息:

private void getFriends()
        {            int previous_cursor=-1;            int next_cursor = -1;            while (next_cursor != 0)
            {                string cursor = Convert.ToString(previous_cursor);                string url = " http://api.t.sina.com.cn/statuses/friends.xml?source=AppKey&cursor=" + cursor;                string username = "dreamzsm@gmail.com";                string password = name; //这里输入你自己微博登录的的密码
                //注意这里的格式哦,为 "username:password"

                System.Net.WebRequest webRequest = System.Net.WebRequest.Create(url);
                System.Net.HttpWebRequest myReq = webRequest as System.Net.HttpWebRequest;                //身份验证
                string usernamePassword = username + ":" + password;
                CredentialCache mycache = new CredentialCache();
                mycache.Add(new Uri(url), "Basic", new NetworkCredential(username, password));
                myReq.Credentials = mycache;
                myReq.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword)));

                WebResponse wr = myReq.GetResponse();
                Stream receiveStream = wr.GetResponseStream();
                StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8);                string content = reader.ReadToEnd();


                XmlDocument xmlDoc = new XmlDocument();

                xmlDoc.LoadXml(content);                // xmlDoc.Load("data1.xml");

                XmlNodeList nodeList = xmlDoc.SelectSingleNode("users").ChildNodes;//获取根节点的所有子节点

                next_cursor = Convert.ToInt16(nodeList.Item(nodeList.Count - 2).InnerText);
                previous_cursor = Convert.ToInt16(nodeList.Item(nodeList.Count-1).InnerText);                string xmlName = "friends_" + nodeList.Item(nodeList.Count - 1).InnerText + "_" + Convert.ToInt16(nodeList.Item(nodeList.Count - 2).InnerText) + ".xml";
                previous_cursor = next_cursor;

                xmlDoc.Save(xmlName);

            }
        }
登录后复制


clip_image002为了程序设计简单一点,笔者就有点偷懒了,没有仔细研究如何将所有的数据写到一个XML文件中,而是每次请求得到的20条数据写成一个XML文件,最后我159个好友,按照指定的命名方法生成了8个XML文件。

如此,就得到了所有的你的好友(就是你跟随的人)的信息了,以单人为例,其主要信息如下:

<user>
    <id>1710993410</id>
    <screen_name>某丫大人</screen_name>
    <name>某丫大人</name>
    <province>43</province>
    <city>1</city>
    <location>湖南 长沙</location>
    <description>饭否儿,心朝饭否,春暖花开。 我还是@饿YA 我还真是懒得介绍了。</description>
    <url>http://1</url>
    <profile_image_url>http://tp3.sinaimg.cn/1710993410/50/1273755892</profile_image_url>
    <domain>
    </domain>
    <gender>f</gender>
    <followers_count>168</followers_count>
    <friends_count>79</friends_count>
    <statuses_count>846</statuses_count>
    <favourites_count>0</favourites_count>
    <created_at>Sun Mar 14 00:00:00 +0800 2010</created_at>
    <following>false</following>
    <verified>false</verified>
    <allow_all_act_msg>false</allow_all_act_msg>
    <geo_enabled>false</geo_enabled>
    <status>
      <created_at>Sun May 16 21:02:44 +0800 2010</created_at>
      <id>364379114</id>
      <text>烦死了快、</text>
      <source>
        <a href="">新浪微博</a>
      </source>
      <favorited>false</favorited>
      <truncated>false</truncated>
      <geo />
      <in_reply_to_status_id>
      </in_reply_to_status_id>
      <in_reply_to_user_id>
      </in_reply_to_user_id>
      <in_reply_to_screen_name>
      </in_reply_to_screen_name>
    </status>
  </user>
登录后复制

可以看到这里面的信息量是超级多的,我简单介绍下几个主要的节点吧

id

用户新浪微博的数字ID,就像你的QQ号一样

name

用户昵称

province

省代号

city

市代号

location

所在省市(好像和上面两个节点重复了)

description

自我描述

domain

域名,就是除了数字ID后,用户申请的修改域名

gender

性别。男的是Male,女的是Female.

followers_count

粉丝数

friends_count

跟随的人数

statuses_count

发表的状态也就是微博数

favourites_count

收藏微博数目吧?(不知道这个有什么用)

created_at

用户创建此微博客的时间

verified

是否经过新浪的VIP认证

status

用户最近的一次状态

除了user信息外,还有一些其它信息,比如根节点下的next_cursor和previous_cousor,这方便用户分多次到服务器上请求数据时可以此作为定位依据。

20

0</previous_cursor></p></td></tr></tbody></table><p><strong>4. </strong><strong>将XML</strong><strong>文件存储到ACCESS</strong><strong>数据库中进行备份</strong></p><p>如果不想备份的可以直接从第3步中到第5步,但是笔者,觉得将数据转换成此构架后,更加方便后来的程序操作以及浏览数据。</p><p>关于XML的详细方法参考:小气的鬼</p><p>《在C#.net中如何操作XML》</p><p>www.cnblogs.com/weekzero/archive/2005/06/21/178140.html</p><p>下面开始读取刚才从新浪微博服务器上请求得到的XML文件了。然后转换成ACCESS数据库内容。(当然你要先用ACCESS在指定目录下建立一个*.mdb文件用来存储数据)</p><p>下面是对单个XML文件进行读取,并插入到数据库中(这段代码是在<a href="http://www.php.cn/wiki/1494.html" target="_blank">ASP.NET</a>中写的)</p><table style="width: 400px;" border="0"><tbody><tr class="firstRow"><td valign="top" width="400" style="word-break: break-all;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'> public void readTsinaFriends(string fileName) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(Server.MapPath(fileName)); XmlNodeList nodeList = xmlDoc.SelectSingleNode("users").ChildNodes;//获取 根节点的所有子节点 ; //删除不用的一级节点,比如提示人数的所在位置的标记 XmlNode root = xmlDoc.SelectSingleNode("users"); // XmlNodeList xnl = xmlDoc.SelectSingleNode("Employees").ChildNodes; for (int k = 0; k < nodeList.Count; k++) { XmlElement xe = (XmlElement)nodeList.Item(k); if(xe.Name=="user") {//去掉XML文件中不需要的节点:next_cursor,previous_coursor以及user节点中的status,方便XML直接转换成DataTable XmlNodeList nodeList1 = xmlDoc.SelectNodes("users/user");//得到所有的标签user一级节点 foreach (XmlNode xmlNodeTemp in nodeList1) { if (xmlNodeTemp.LastChild.Name == "status")//移除每个user节点中的"status"子节点--(一般情况下此节点都放在最后一个,所以就不遍历了,直接地址定位) { xmlNodeTemp.RemoveChild(xmlNodeTemp.LastChild); } } } else if (xe.Name == "next_cursor" || xe.Name == "previous_cursor") { root.RemoveChild(xe); if (k < nodeList.Count) k = k - 1; } } string tbxml = xmlDoc.OuterXml; DataTable dt = new DataTable(); DataSet ds = new DataSet(); System.IO.StringReader reader = new System.IO.StringReader(tbxml); ds.ReadXml(reader); dt = ds.Tables[0];//如果XML文本中有同名的父子节点,那么此语句就会多读出一条数据,这可能是此API函数的局限性吧 DataTable dtCopy = dt.Copy(); //dtCopy.Columns.Remove("url"); //dtCopy.Columns.Remove("profile_image_url"); dtCopy.Columns.Remove("description"); //这个字段里面字符编码不太规则,在插入ACCESS的时候总有问题,而且用处不大,所以就去除了。(又偷懒了呃) DataRow drTemp = dtCopy.NewRow(); string strInsert = string.Empty; OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\coursware\\网络软文\\API_微波\\weibo.mdb"); aConnection.Open(); for (int i = 0; i < dtCopy.Rows.Count - 1; i++) { drTemp = dtCopy.Rows[i]; strInsert = "&#39;"+drTemp[0].ToString()+"&#39;,&#39;"; for (int j = 1; j < dtCopy.Columns.Count - 1; j++) { strInsert += (drTemp[j].ToString() + "&#39;,&#39;"); } strInsert += drTemp[dtCopy.Columns.Count - 1].ToString() + "&#39;"; string strCmd = "INSERT INTO Friends VALUES(" + strInsert + ")"; OleDbCommand command = new OleDbCommand(strCmd, aConnection); command.ExecuteNonQuery(); } aConnection.Close(); }

登录后复制

对多个XML文件进行遍历,一个个导入到ACCESS数据库中:

 /// <summary>
    /// 将所有好友都导出了,然后存储在ACCESS数据库中了。
    /// </summary>
    public void readAllXml()
    {        for (int i = 0; i < 8; i++)
        {            string fileName = "friends_" + Convert.ToString(i * 20) + "_" + Convert.ToString(i*20+20)+".xml";//按照存储XML文件时的命名规则进行读取
            readTsinaFriends(fileName);
        }
    }
登录后复制

经过上面的操作后,你再打开你的ACCESS数据库文件weibo.mdb文件中对应的表,就可以看到所以的信息都已经导入到ACCESS中了。如下图所示:

clip_image004

5. 对ACCESS数据库查询并写成RSS阅读器的OPML格式

对于制作RSS阅读器的OPML格式,需要的数据只有两条字段:一个是id字段,一个是name字段。

这个过程实际上就是对数据进行XML编码的过程,啥都不说了,一切都在代码中了(也是在ASP.NET工程中写的):

/// <summary>
    /// 建立新浪微博的RSS文件
    /// </summary>
    public void CreateTsinaRssXmlFile()
    {

        OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\coursware\\网络软文\\API_微波\\weibo.mdb");        string strCmd = "select id as idnum,screen_name as name from Friends";        //从ACCESS中获取数据
        aConnection.Open();
        OleDbDataAdapter da = new OleDbDataAdapter(strCmd, aConnection);
        DataSet ds = new DataSet();
        da.Fill(ds, "TSina");
        ds.DataSetName = "RssReader";
        DataTable dt = ds.Tables[0];//数据集的第0张表格


        XmlDocument xmldoc;

        XmlElement xmlelem;

        xmldoc = new XmlDocument();        //加入XML的声明段落
        XmlDeclaration xmldecl;
        xmldecl = xmldoc.CreateXmlDeclaration("1.0", "UTF-8", null);
        xmldoc.AppendChild(xmldecl);        //加入一个根元素
        xmlelem = xmldoc.CreateElement(" ", "opml", " ");
        xmldoc.AppendChild(xmlelem);

        XmlNode root = xmldoc.SelectSingleNode("opml");//查找<opml> 节点


        XmlElement xeHead = xmldoc.CreateElement("head");//创建一个<head>节点 
        //为head节点增加子节点
        XmlElement xeHeadsub = xmldoc.CreateElement("title");
        xeHeadsub.InnerText = "Rss Reader";//设置节点文本 
        xeHead.AppendChild(xeHeadsub);//添加到<head>子节点中 
        root.AppendChild(xeHead);//添加到<head>节点中 


        //增加body子节点,然后,将所有的RSS订阅信息全部写入到body节点中间
        XmlElement xeBody = xmldoc.CreateElement("body");
        root.AppendChild(xeBody);        //第一层循环是标签(文件夹循环)由于本次只做一个标签,所以就只循环一次了

        //RSS的文件夹属性节点
        XmlElement xe1 = xmldoc.CreateElement("outline");
        xe1.SetAttribute("text", "Tsina");//设置该节点title属性
        xe1.SetAttribute("title", "Tsina");//设置该节点title属性 --第一层的outline节点的属性表示的是RSS的标签或者说是文件夹


        //下面就要开始为此文件夹节点添加下属子节点,也就是添加一些实质的RSS地址了
        string strTitle = string.Empty;        string strText = string.Empty;        string strXmlUrl = string.Empty;        string strHtmlUrl = string.Empty;        for (int i = 0; i < dt.Rows.Count; i++)
        {
            strTitle = dt.Rows[i]["NAME"].ToString().Trim();
            strText = strTitle;
            strXmlUrl = "http://medcl.net/SinaRss.aspx?uid=" + dt.Rows[i]["IDNum"].ToString().Trim();
            strHtmlUrl = "http://t.sina.com.cn/" + dt.Rows[i]["IDNum"].ToString().Trim();

            XmlElement xesub1 = xmldoc.CreateElement("outline");
            xesub1.SetAttribute("text", strText);//设置该节点title属性
            xesub1.SetAttribute("title", strTitle);//设置该节点title属性 --第一层的outline节点的属性表示的是RSS的标签或者说是文件夹
            xesub1.SetAttribute("type", "rss");
            xesub1.SetAttribute("xmlUrl", strXmlUrl);

            xesub1.SetAttribute("htmlUrl", strHtmlUrl);
            xe1.AppendChild(xesub1);//添加到<Node>节点中 
        }
        xeBody.AppendChild(xe1);        //保存创建好的XML文档
        xmldoc.Save(Server.MapPath("RssReader.xml"));

    }
登录后复制

 

最后在指定的目录下,程序就自动生成了一个RssReader.xml的文件了。大功告成了!

clip_image006

然后将此文件就可以导入到任何一个RSS阅读器中了,用户就能够通过RSS阅读器来获取微博信息了,而且现在的RSS阅读器都有个一键转贴到微博的功能,很方便的,不想转到自己微博的,也可以通过RSS阅读器直接收藏到阅读器中。辛苦了两天,今天能有这么一点小成果,还是觉得很不错的,呵呵,也祝大家也能好运。本次代码比较还需要各种完善,比如,如何将所以的数据写成一个XML文件,这个笔者就暂时不做了,留给大家去做吧。

Rss阅读器效果图如下:

clip_image008

【相关推荐】

1. RSS高校入门教程

以上是调用API生成RSS资源文件的实例详解的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PHP和Manticore Search开发指南:快速创建搜索API PHP和Manticore Search开发指南:快速创建搜索API Aug 07, 2023 pm 06:05 PM

PHP和ManticoreSearch开发指南:快速创建搜索API搜索是现代Web应用程序中不可或缺的功能之一。无论是电子商务网站、社交媒体平台还是新闻门户,都需要提供一个高效、准确的搜索功能来帮助用户找到他们感兴趣的内容。而ManticoreSearch作为一个性能卓越的全文搜索引擎,为我们提供了一个强大的工具来创建出色的搜索API。本文将向您介绍如何

如何在PHP项目中通过调用API接口来实现数据的爬取和处理? 如何在PHP项目中通过调用API接口来实现数据的爬取和处理? Sep 05, 2023 am 08:41 AM

如何在PHP项目中通过调用API接口来实现数据的爬取和处理?一、介绍在PHP项目中,我们经常需要爬取其他网站的数据,并对这些数据进行处理。而许多网站提供了API接口,我们可以通过调用这些接口来获取数据。本文将介绍如何使用PHP来调用API接口,实现数据的爬取和处理。二、获取API接口的URL和参数在开始之前,我们需要先获取目标API接口的URL以及所需的

如何处理Laravel API报错问题 如何处理Laravel API报错问题 Mar 06, 2024 pm 05:18 PM

标题:如何处理LaravelAPI报错问题,需要具体代码示例在进行Laravel开发时,经常会遇到API报错的情况。这些报错可能来自于程序代码逻辑错误、数据库查询问题或是外部API请求失败等多种原因。如何处理这些报错是一个关键的问题,本文将通过具体的代码示例来演示如何有效处理LaravelAPI报错问题。1.错误处理在Laravel

使用Python将API数据保存为CSV格式 使用Python将API数据保存为CSV格式 Aug 31, 2023 pm 09:09 PM

在数据驱动的应用程序和分析领域,API(应用程序编程接口)在从各种来源检索数据方面发挥着至关重要的作用。使用API数据时,通常需要以易于访问和操作的格式存储数据。其中一种格式是CSV(逗号分隔值),它允许有效地组织和存储表格数据。本文将探讨使用强大的编程语言Python将API数据保存为CSV格式的过程。通过遵循本指南中概述的步骤,我们将学习如何从API检索数据、提取相关信息并将其存储在CSV文件中以供进一步分析和处理。让我们深入了解使用Python进行API数据处理的世界,并释放CSV格式的潜

React API调用指南:如何与后端API进行交互和数据传输 React API调用指南:如何与后端API进行交互和数据传输 Sep 26, 2023 am 10:19 AM

ReactAPI调用指南:如何与后端API进行交互和数据传输概述:在现代的Web开发中,与后端API进行交互和数据传输是一个常见的需求。React作为一个流行的前端框架,提供了一些强大的工具和功能来简化这一过程。本文将介绍如何使用React来调用后端API,包括基本的GET和POST请求,并提供具体的代码示例。安装所需的依赖:首先,确保在项目中安装了Axi

Oracle API使用指南:探索数据接口技术 Oracle API使用指南:探索数据接口技术 Mar 07, 2024 am 11:12 AM

Oracle是一家全球知名的数据库管理系统提供商,其API(ApplicationProgrammingInterface,应用程序接口)是一种强大的工具,可帮助开发人员轻松地与Oracle数据库进行交互和集成。在本文中,我们将深入探讨OracleAPI的使用指南,向读者展示如何在开发过程中利用数据接口技术,同时提供具体的代码示例。1.Oracle

Oracle API集成策略解析:实现系统间无缝通信 Oracle API集成策略解析:实现系统间无缝通信 Mar 07, 2024 pm 10:09 PM

OracleAPI集成策略解析:实现系统间无缝通信,需要具体代码示例在当今数字化时代,企业内部系统之间需要相互通信和数据共享,而OracleAPI就是帮助实现系统间无缝通信的重要工具之一。本文将从OracleAPI的基本概念和原理入手,探讨API集成的策略,最终给出具体的代码示例帮助读者更好地理解和应用OracleAPI。一、OracleAPI基本

如何使用MongoDB开发一个简单的 CRUD API 如何使用MongoDB开发一个简单的 CRUD API Sep 19, 2023 pm 12:32 PM

如何使用MongoDB开发一个简单的CRUDAPI在现代的Web应用程序开发中,CRUD(增删改查)操作是非常常见和重要的功能之一。在本文中,我们将介绍如何使用MongoDB数据库开发一个简单的CRUDAPI,并提供具体的代码示例。MongoDB是一个开源的NoSQL数据库,它以文档的形式存储数据。与传统的关系型数据库不同,MongoDB没有预定义的模式

See all articles