Как сделать 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.
  • Вопрос задан
  • 246 просмотров
Пригласить эксперта
Ответы на вопрос 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
Имена детей уникальны у родителя.

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

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

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

Войти через центр авторизации
Похожие вопросы