【问题标题】:How to insert an object to an object in Mongodb如何将对象插入到MongoDB中的对象中
【发布时间】:2020-07-16 21:47:44
【问题描述】:

所以我一直在寻找 2 周来寻找这个问题的答案,但似乎不可能或者我不知道。 例如,如您所知,在 JSON 中您可以执行以下操作(提到流媒体部分,您可以将任意数量的对象添加到另一个对象。):

data = {
    "name": "amirreza",
    "age": 24,
    "streamers": {
        "mine": False, "snipe": True
    }
} 

在此之前,我尝试使用 $set,但它没有按我的意愿工作,它只是替换了列表中的最后一个对象:

list = ["test1", "test2", "test3", "test4"]
for i in list:
    s = status.find_one({"_id": 1})
    s2 = s["streamers"]
    if i in s2:
        print("y")
    elif not i in s2:
        status.update_one({"_id": 1}, {"$set": {"streamers": {i: False}}})

现在我想要的是

data = {
    "name": "amirreza",
    "age": 24,
    "streamers": {
        "test1": False, "test2": False, "test3": False, "test4": False
    }
} 

但它给出了这个:

data = {
    "name": "amirreza",
    "age": 24,
    "streamers": {
        "test4": False
    }
} 

【问题讨论】:

    标签: python database mongodb object pymongo


    【解决方案1】:

    status.update_one({"_id": 1}, {"$set": {"streamers": {i: False}}}) 不应该在循环中。通过循环遍历s2,您将为每次迭代更新s2,因此为了形象化,第一次迭代将s2 设置为"streamers": { "test1": False},第二次将s2 设置为"streamers": { "test2": False},依此类推...,直到您到达列表的末尾,并且最后一次迭代将s2 设置为"streamers": { "test4": False},您会得到该结果,因为这就是 $set 运算符的工作方式,它会更新整个对象。

    您已接近解决方案。你应该简单地通过循环s2来构造一个对象,最后,在你创建了对象之后,你就退出了for循环,你调用了status.update_one({"_id": 1}, {"$set": {"streamers": YOUR_OBJECT}})。这样您就可以使用 所有 流媒体更新 status,而不是单独更新每个流媒体。

    【讨论】:

    • 谢谢!,它成功了,但还有一个问题,我不想每次都更新整个“流媒体”,如果它们不在字典中,我只想添加它们。
    • 你也可以用 Python 做到这一点。 if key not in d:
    • 我做了,但我不想删除以前的数据,我只想添加新数据。 (因为它每 60 秒重复一次)
    猜你喜欢
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多