Задать вопрос

Как сделать update объекта в массиве в объекте или вставить его если его там нет?

Есть БД родители-дети.
Имена родителей уникальны. Имена детей уникальны у родителя.
{
  parent: "Ivan Ivanov",
  children: [{
    {name: Masha,
     age: 20,
     sex: female
    },
    {name: Vasya,
     age: 23,
     sex: female
  }]
}

допустим, ребенок сменил пол - как обновить информацию, если ребенок с таким именем уже есть, а нет то вставить?
db.parents.update({parent: "Ivan Ivanov"}, {$addToSet: {children: {name: Vasya, age: 23, sex: male}}}, {upsert:true});

- просто добавляет еще одного ребенка Vasya.
  • Вопрос задан
  • 249 просмотров
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
taliban
@taliban
php программист
https://docs.mongodb.com/manual/reference/method/d...
upsert: true

upd:
db.parents.update(
	{"$and": [
		{
			parent: "Ivan Ivanov"
		},
		{
			"children.name": Vasya
			"children.age": 23
			"children.sex": "male"
		}
	]},
	{
		"children.sex": "female"
		// тут, если не сработает, попробуйте полностью обьект заменить
	}
)

как-то так тоже попробуйте

upd2:

чем больше работаю с монгой, тем больше она мне нравится, вот 100% рабочий вариант:

db.getCollection('parents').update({"parent": "Ivan Ivanov", "children.age": 23}, {"$set": {"children.$.sex": "male"}})
Ответ написан
@lega
Имена детей уникальны у родителя.

Если нужна уникальность в пределах документа, используйте словарь (объект) вместо массива.

Судя по этой структуре, в базе либо будут дубли детей, либо у детей не будет детей и будет только один родитель, если на детей нужно будет ссылаться, то лучше их хранить отдельными документами.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы