ИЗМЕНЕНО, ЧТОБЫ ВКЛЮЧИТЬ ПРАВИЛЬНОЕ РЕШЕНИЕ
Это именно та проблема, с которой я столкнулся при изучении Mongo - вы ищете оператор $addToSet
( см. Документы здесь ), который используется с командой update
в сочетании с позиционным оператором $
, который вы использовали.
$ addToSet
{$ addToSet: {field: value}}
Добавляет значение в массив, только если его уже нет в массиве.
Таким образом, запрос становится (db.stack - это коллекция, которую я использовал для целей тестирования), пример запускается вследуйте:
db.stack.update({ "trips.name":"2010-05-10" },
{ $addToSet: { "trips.$.loc":{"lat":11, "lng":12} } }
);
TEST RUN (с некоторыми сокращениями для пробелов элементов, которые не важны):
#### YOUR ITEM IN THE DB
> db.stack.find({"trips.name":"2010-05-10"})
{ "_id" : ObjectId("4c28f62cbf8544c60506f11d"), "some_other_data" : "goes here",
"trips" : [
{ "name" : "2010-05-10",
"loc" : [ {
"lat" : 21.321231,
"lng" : 16.8783234,
"updated_at" : "Mon May 10 2010 15:24:35"
}, { "lat" : 21.321231,
"lng" : 16.8783234,
"updated_at" : "Mon May 10 2010 15:24:24"
} ] },
{ "name" : "2010-05-08",
"loc" : [ ... ]
} ] }
#### SUCCESSFULLY ADDS ITEM TO PROPER ARRAY
> db.stack.update({"trips.name":"2010-05-10"}, {$addToSet: {"trips.$.loc":{"lat":11, "lng":11}}});
> db.stack.findOne()
{ "_id" : ObjectId("4c28f62cbf8544c60506f11d"), "some_other_data" : "goes here",
"trips" : [
{ "loc" : [
{ "lat" : 21.321231,
"lng" : 16.8783234,
"updated_at" : "Mon May 10 2010 15:24:35"
}, { "lat" : 21.321231,
"lng" : 16.8783234,
"updated_at" : "Mon May 10 2010 15:24:24"
}, { "lat" : 11,
"lng" : 11
}
], "name" : "2010-05-10"
},
{ "name" : "2010-05-08",
"loc" : [ ... ]
} ] }
#### ON REPEAT RUN DOESN'T ADD NEW ELEMENT
> db.stack.update({"trips.name":"2010-05-10"}, {$addToSet: {"trips.$.loc":{"lat":11, "lng":11}}});
> db.stack.findOne()
{ "_id" : ObjectId("4c28f62cbf8544c60506f11d"), "some_other_data" : "goes here",
"trips" : [ {
"loc" : [
{ "lat" : 21.321231,
"lng" : 16.8783234,
"updated_at" : "Mon May 10 2010 15:24:35"
}, { "lat" : 21.321231,
"lng" : 16.8783234,
"updated_at" : "Mon May 10 2010 15:24:24"
}, { "lat" : 11,
"lng" : 11
}
], "name" : "2010-05-10"
},
{ "name" : "2010-05-08",
"loc" : [ ... ]
} ] }
#### BUT WILL CORRECTLY ADD ANOTHER ELEMENT TO THE SAME ARRAY IF IT'S NOT PRESENT
> db.stack.update({"trips.name":"2010-05-10"}, {$addToSet: {"trips.$.loc":{"lat":11, "lng":12}}});
> db.stack.findOne()
{ "_id" : ObjectId("4c28f62cbf8544c60506f11d"), "some_other_data" : "goes here",
"trips" : [
{ "loc" : [
{ "lat" : 21.321231,
"lng" : 16.8783234,
"updated_at" : "Mon May 10 2010 15:24:35"
}, { "lat" : 21.321231,
"lng" : 16.8783234,
"updated_at" : "Mon May 10 2010 15:24:24"
}, { "lat" : 11,
"lng" : 11
}, { "lat" : 11,
"lng" : 12
}
], "name" : "2010-05-10"
},
{ "name" : "2010-05-08",
"loc" : [ ... ]
} ] }