如何使用ORM代替mongo對嵌套集合進行插入和刪除數據(MongoEngine語法)

需求闡述:

下面是一張我們存儲到mongodb數據庫中的數據格式,我們的需求是使用orm的方式將新的評論數據插入的某條文章的review子集合中去。

解決方法: 

兩個model對應的是上面json,Review是Article的嵌套子集合,我們需要把新的評論數據插入到子集中去


class Review(EmbeddedDocument):
	name = StringField(max_length=255, required=True)
	image = StringField(max_length=255, required=True)
	time = DateTimeField( default=datetime.datetime.now,required=True)
	content = StringField(max_length=255, required=True)
	good = IntField(default=0, required=True)
	reply = StringField(max_length=255, required=True)
	other = StringField(max_length=255, required=True)

class Article(Document):
	title = StringField(max_length=255, required=True)
	text = StringField(max_length=255, required=True)
	url = StringField(max_length=255, required=True)
	time = DateTimeField(default=datetime.datetime.now,required=True)
	image = StringField(max_length=255, required=True)
	type = StringField(max_length=255, required=True)
	publisher = IntField(default=0, required=True)
	review = ListField(EmbeddedDocumentField(Review))

1.插入數據 

  •  使用mongo語句操作:
db.article.update(
    {_id:ObjectId("5e58f565ab74fbfd66cc5df5")},
    {$push:
        {review:
            {"name":"大傻子","image":"/static/url/xxx","time":"2012-12-26","content":"哈哈哈哈","good":20,"reply":[],"other":[]
            }
        }
    }
)
  • 使用ORM語法:
Article.objects(id="5e58f565ab74fbfd66cc5df5").update_one(push__review={"name":"大傻子","image":"/static/url/xxx","time":"2019-12-26","content":"嘻嘻嘻","good":20,"reply":"","other":""})

2.刪除數據

  • 使用mongo語法操作:
db.article.remove({_id:ObjectId("5e58f565ab74fbfd66cc5df5"),"review._id":1})
  • 使用ORM語法 
Article.objects(id="5e58f565ab74fbfd66cc5df6").update_one(pull__review__other=1)

3.其他

	# 查詢文章評論
	Article.objects.get(id="5e58f565ab74fbfd66cc5df5").review
	# 批量插入
	for i in range(10):
		Article.objects(id="5e58f565ab74fbfd66cc5df6").update_one(push__review={"name":"大傻子","image":"/static/url/xxx","time":"2019-12-26","content":"嘻嘻嘻","good":"","feel":1,"other":i})
	
	# 刪除文章的子集中評論other等於3的數據
	Article.objects(id="5e58f565ab74fbfd66cc5df6").update_one(pull__review__other=3)

	# 將評論數據的對象轉化爲json形式
	reviews = [r.to_json() for r in Article.objects(id="5e58f565ab74fbfd66cc5df6")[0].review]

	reviews = []
	# 批量查詢文章評論子集並進行修改存儲到列表
	for r in Article.objects(id="5e58f565ab74fbfd66cc5df6")[0].review:
		review = r.to_mongo()
		time = review["time"].strftime('%Y{y}%m{m}%d{d} %H:%M').format(y='年', m='月', d='日')
		review.update({"time":time})
		reviews.append(dict(review))
	print(reviews)

	# 修改數據庫的某一個字段
	a= Article.objects(id="5e58f565ab74fbfd66cc5df6")[0]
	a.views=1
	a.save()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章