我在MongoDB中有一个文档,结构如下:
{
"_id":"$oid":"621fbaeaeedd1c000e60fbd2"},
"username":"myuser",
"password":"mypassword",
"comments":["comment1", "comment2", "comment3"]
}
我有一个向量的评论:
std::vector<std::string> mycomments;
mycomments.push_back("comment2");
mycomments.push_back("comment4");
我想把向量“mycoments”的每个字符串插入MongoDB文档中的数组“comments”中,如果还没有的话。我看过MongoDB文档,但是我不知道如何使用函数“update_one”,因为文档中只有一个非常简单的例子。所以我采用的解决方案如下:我得到注解的内容并把它放到一个向量中,我把mycomments的每个字符串都推到这个向量中(如果它还不存在的话),然后我删除MongoDB中的文档并插入一个带有新值的新文档:
bsoncxx::stdx::optional<bsoncxx::document::value> res = collection.find_one(document{} << "username" << username << finalize);
if (res)
{
coll.delete_one(document{} << "username" << username << finalize);
document data_builder{};
data_builder << "username" << username << "password" << password;
auto array_builder = data_builder << "comments" << open_array;
for (std::string str : myNewVector)
{
array_builder << str;
}
array_builder << close_array;
bsoncxx::document::view_or_value doc = data_builder << finalize;
coll.insert_one(doc);
}
显然这是一个非常愚蠢的解决方案,因为使用update_one函数就足够了,但是从文档中我不明白如何使用它(在这个复杂的情况下)。
3条答案
按热度按时间hivapdat1#
如果您想保持顺序,那么您必须获取文档,并且只推送文档中不存在的注解。
然后,您可以使用
$push
和$each
修饰符。https://docs.mongodb.com/manual/reference/operator/update/push/#append-multiple-values-to-an-array我运行了这个代码:
我得到了:
["comment1", "comment2", "comment3", "comment2", "comment4"]
ggazkfy82#
将多个字符串添加到数组中而不重复的一种方法是使用
$addToSet
运算符和$each
修饰符:qpgpyjmq3#
如果要推送新元素而不篡改现有字符串数组,请尝试以下代码段:
要清除字段中的现有元素并使用新的字符串数组对其进行更新,可以尝试以下操作