2 u011250851 u011250851 于 2016.01.29 09:43 提问

Mongodb中如何实现一对多?在一个文档中嵌套多个文档?

如题,
我知道如下这样可以在文档中嵌入一个文档:

 db.insertdb.insert({_id:2,by:'测试',auther:{name:'小明',age:23}})

但不知怎么嵌入多个,还有如何在一个已有文档中新添一个子文档,求mongodb前辈告知,多谢!

4个回答

u011250851
u011250851   2016.02.18 10:07
已采纳
fk002008
fk002008   2016.01.29 19:22

不是阿,你使用的是修改器,其实本质就是对象没有这个属性的时候那就新加入一个属性

我给你回答的是在这个对象的使用方面上文档对象 使用方法就是js
可不是mongodb的语法与js一样。

像你提的这个问题:
可以把这个对象查找出来再用我给你提供的方法解决
var doc = db.myFirstCollection.findOne({_id:1}) //使用id查找出来这个对象。
然后你进行doc的更新
doc.auther = [{name:1},{name:2},{name:3}] //这个属性操作和js一样
然后你把这个doc更新到db中
db.myFirstCollection.update({_id:1},doc)

修改器只不过是简化了上面的操作而已

我给你演示的是它更具有普适性的操作。
$inc ,$set 都是对象没有属性的时候就添加一个
这种动态性思想是js的

u011250851
u011250851 明白了,多谢了!
接近 2 年之前 回复
oyljerry
oyljerry   Ds   Rxr 2016.01.29 11:35

多个文档,就是多个key下面的元素还是一个document。
添加就是直接update set来设置对应的key的value是一个document类型的数据

u011250851
u011250851 是不是只能这样操作:db.myFirstCollection.update({_id:1},{$set:{auther:[{name:1},{name:2},{name:3}]}})
接近 2 年之前 回复
u011250851
u011250851 现在我要加入一个auther :
接近 2 年之前 回复
u011250851
u011250851 现在我要加入一个auther :
接近 2 年之前 回复
u011250851
u011250851 举个例子 如果原来的记录是这样:db.myFirstCollection.insert({_id:1,auther:[{name:'1'},{name:'2'}]})
接近 2 年之前 回复
u011250851
u011250851 举个例子 如果原来的记录是这样:db.myFirstCollection.insert({_id:1,auther:[{name:'1'},{name:'2'}]})
接近 2 年之前 回复
fk002008
fk002008   2016.01.29 16:04

MONODB的数据文档是JSON,利用JS的知识看它

var doc = {K:V} ;
doc[k] = V;
这不就是js的对象使用方法么
你说给js一个对象动态添加属性怎么玩呢?
doc.addPro = xxxx
这就是文档对象添加属性了

如果是嵌套的,那也一样,假设这里的V是嵌套的子文档
那么 doc[k]就是V了,嘿嘿整体法看看
V又是是一个文档,假设它的key是k1
doc[k][k1]
你发现规律了么?
是不是很象二维数组
不嵌套文档是 一个[]
嵌套一个文档是 [][]

归纳下,嵌套n个文档就是 doc[][][].......[]总共有n+1个[]

我们使用js操作了这个文档对象之后,只要把它在更新到数据库中就可以了。

记住本质操作是 js

u011250851
u011250851 如果原来的记录是这样:db.myFirstCollection.insert({_id:1,auther:[{name:'1'},{name:'2'}]}), 现在我要加入一个auther : 是不是只能这样操作:db.myFirstCollection.update({_id:1},{$set:{auther:[{name:1},{name:2},{name:3}]}})
接近 2 年之前 回复
u011250851
u011250851 mongodb 语法也不是和 js完全一致的啊。就像下面这样:
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!