Как добавить новый документ в сложный 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"
}
}
]
}