Как добавить новый документ в сложный Collection-Object

У меня есть коллекция:

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

Каждый элемент коллекции состоит из массива 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
    }
)

Update:
newQuery -> any string (например, с сервера) для использования в document.tasks[index].query
Эти значения я делаю в своем коде и должен проверить, существуют ли они в БД:
uid + link + (query + (TIMESTAMP + PROVIDER))


Обновить v2

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

Найти UID == "id3" и в массиве задач в списке-массиве "lid" == "lX", а если он не найден, нажмите новый документ в task.list-array:

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

Но в этом случае 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"
                        }
                }
        ]
}

Вы можете помочь мне добавить некоторые данные в коллекцию MongoDB? Спасибо!

Ответы

Ответ 1

Угадай, чего хочешь.

Это оригинальный документ

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

вы можете сделать это:

db.demo.update({"tasks": { $elemMatch: { "query": "lorem lorem" }}}, {$push: {"tasks.$.list": {"timestamp": "160", "provider": "Lor Em"}}});

И вы получите это в своем обновленном документе:

{"_id" : ObjectId("588b8ff15a66b2e3316ce70a"),
"uid" : "9a8a2c5b9418cc1baadfa41255791414",
"link" : "http://stackoverflow.com/questions",
"tasks" : [
    {
        "query" : "lorem lorem",
        "list" : [
            {
                "timestamp" : "159",
                "provider" : "Lor Em"
            },
            {
                "timestamp" : "160",
                "provider" : "Lor Em"
            }
        ]
    }
]}

Ответ 2

Вы можете использовать $addToSet. Это будет добавлено только к массиву, если оно еще не существует. Например:

Перед обновлением:

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

Затем выполните обновление:

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

После первого обновления:

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

После второго обновления:

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