{nazwa użytkownika:'ja', firmy:{"twojafirma":{...}}

Chcę wstawić firmę do rekordu użytkownika (zbiór użytkowników), aby:

{nazwa użytkownika:'ja', firmy:{ "twojafirma":{...}, "mojafirma":{...} }

Ale nazwa jest dynamiczna..

var companyid = "mycompany";

.collection('users').findAndModify(
{username: usern}, 
[['_id', 'asc']], 
{$set:{companies:{companyid: { desksmemberships:[] }}}},    
{new: true}, function(){...}

Daje to... {nazwa użytkownika:'ja', firmy:{ "twojafirma":{...}, "identyfikator firmy":{...} }

Jak mam to zrobic?

3
John Williams 29 sierpień 2012, 22:51

2 odpowiedzi

Najlepsza odpowiedź

Musisz programowo zbudować modyfikator $set:

var modifier = { $set: {} };
modifier.$set['companies.' + companyid] = { desksmemberships:[] };

A następnie użyj modifier jako trzeciego parametru w wywołaniu findAndModify.

Możesz również rozważyć zmianę companies na tablicę zamiast osadzonego obiektu.

Aktualizacja Node.js 4.x

Możesz teraz korzystać z właściwości obliczanej składnia, aby zrobić to bezpośrednio w literale obiektowym:

collection('users').findAndModify(
    {username: usern}, 
    [['_id', 'asc']], 
    {$set:{['companies.' + companyid]: { desksmemberships:[] }}},    
    {new: true},
    function(){...});
6
JohnnyHK 23 styczeń 2019, 08:05

Widziałem to pytanie w wielu postach, niektóre z nich są dość skomplikowane - nazwij mnie szalonym, ale możesz to zrobić (node ​​+ mongo):

Mój schemat bazy danych "pasuje" jest ustawiony na tablicę. W danych mongo [match.matchId] staje się „2028856183”.

db.update({key: value}, {matches: [{[match.matchId] : match}] }, callback);
db.update(what to find, what to change it to, what to do next)

Możesz użyć dowolnej zmiennej w nawiasach.

0
KazaJhodo 6 grudzień 2015, 11:38