如何在复杂的Collection-Object中附加新文档

15 database mongodb

我有一个集合:

{
    "_id": ObjectId("503b83dfad79cc8d26000004"),
    "uid": "9a8a2c5b9418cc1baadfa41255791414",
    "link": "http://stackoverflow.com/questions",
    "tasks": [
      {
        "query": "lorem lorem",
        "list": [
          {
            "timestamp": "159",
            "provider": "Lor Em"
          }
        ]
      }
    ]
}
Run Code Online (Sandbox Code Playgroud)

每个集合元素都包含TASKS数组.每个TASK元素都包含Query + List-array.

我必须附加,如果可能是新的TASK[index].LIST-object(见图)

在此输入图像描述

但是我无法理解,我怎么能全部检查CASE_TO_FIND_ELEMENT:

db.myCollection.update(
    {<CASE_TO_FIND_ELEMENT>},
    {
        $push: {
            list: {
                timestamp: "1233",
                provider: "myNewProvier"
            }                
        }
    },
    {
        upsert: true,
        multi: false
    }
)
Run Code Online (Sandbox Code Playgroud)

更新:(
newQuery -> any string例如从服务器)使用in document.tasks[index].query
我在我的代码中创建这个值,并且必须检查它们是否存在于DB中:
uid + link + (query + (TIMESTAMP + PROVIDER))


更新v2

> db.demo.find().pretty()
{
    "_id" : ObjectId("564f04f4be5d6f2f98c77dcd"),
    "uid" : "id3",
    "task" : [
            {
                    "list" : {
                            "lid" : "lX",
                            "ltext" : "demoX"
                    }
            }
    ]
}
Run Code Online (Sandbox Code Playgroud)

UID == "id3"在list-array中搜索并在任务数组中"lid" == "lX",如果没有找到,则按下新文档task.list-array:

 db.demo.update({
     "uid": "id3",
     "task.list.lid": "lX"
 }, {
     $push: {
         "task": {
             "list": {
                 "lid": "lX2",
                 "ltext": "demoX2"
             }
         }
     }
 }, true, false)
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,mongo在数组中插入一个新的doc :(

> db.demo.find().pretty()
{
        "_id" : ObjectId("564f04f4be5d6f2f98c77dcd"),
        "uid" : "id3",
        "task" : [
                {
                        "list" : {
                                "lid" : "lX",
                                "ltext" : "demoX"
                        }
                },
                {
                        "list" : {
                                "lid" : "lX2",
                                "ltext" : "demoX2"
                        }
                },
                {
                        "list" : {
                                "lid" : "lX2",
                                "ltext" : "demoX2"
                        }
                }
        ]
}
Run Code Online (Sandbox Code Playgroud)

你可以帮我在MongoDB集合中添加一些数据吗?谢谢!

Dav*_*ica 0

您可以使用$addToSet。如果数组尚不存在,则只会将其追加到数组中。例如:

更新前:

{
    "_id" : ObjectId("564f04f4be5d6f2f98c77dcd"),
    "uid" : "id3",
    "task" : [
            {
                    "list" : {
                            "lid" : "lX",
                            "ltext" : "demoX"
                    }
            }
    ]
}
Run Code Online (Sandbox Code Playgroud)

然后进行更新:

db.demo.update({
     "uid": "id3",
     "task.list.lid": "lX"
 }, {
     $addToSet: {
         "task": {
             "list": {
                 "lid": "lX2",
                 "ltext": "demoX2"
             }
         }
     }
 }, true, false)
Run Code Online (Sandbox Code Playgroud)

第一次更新后:

{
        "_id" : ObjectId("564f04f4be5d6f2f98c77dcd"),
        "uid" : "id3",
        "task" : [
                {
                        "list" : {
                                "lid" : "lX",
                                "ltext" : "demoX"
                        }
                },
                {
                        "list" : {
                                "lid" : "lX2",
                                "ltext" : "demoX2"
                        }
                }
        ]
}
Run Code Online (Sandbox Code Playgroud)

第二次更新后:

{
        "_id" : ObjectId("564f04f4be5d6f2f98c77dcd"),
        "uid" : "id3",
        "task" : [
                {
                        "list" : {
                                "lid" : "lX",
                                "ltext" : "demoX"
                        }
                },
                {
                        "list" : {
                                "lid" : "lX2",
                                "ltext" : "demoX2"
                        }
                }
        ]
}
Run Code Online (Sandbox Code Playgroud)