在this帖子中,接受的答案解释说,在upsert操作中,$set
和$setOnInsert
下的字段不能相同。
有人可以解释为什么会这样吗?似乎$setOnInsert
不应与$set
发生冲突,因为前者在插入文档时使用,后者在文档更新时使用。
答案 0 :(得分:4)
$ set 运算符也用于 upsert 。因此,在 $ set 和 $ setOnInsert 上引用相同的字段是无稽之谈。
试试这个空集合:
#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <boost/interprocess/streams/bufferstream.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
using namespace boost::interprocess;
....
_shm = new shared_memory_object(open_or_create,shm_name,read_write);
_shm->truncate(shm_size);
_reg = new mapped_region( _shm,read_write);
...
// write the serializable structure
obufferstream bs(static_cast<char*>(region.get_address()),_reg->get_size());
boost::archive::binary_oarchive arch(dynamic_cast<ostream&>(bs));
arch << my_struct;
...
// read the serializable structure
ibufferstream bs(static_cast<char*>(_reg->get_address()),_reg->get_size());
boost::archive::binary_oarchive arch(dynamic_cast<istream&>(bs));
arch >> my_struct;
答案 1 :(得分:1)
我遇到了这个问题。如果有人在寻找解决方案,则需要了解$ set和$ setOnInsert机制的工作原理 如果找到$ set,则会刷新(忽略$ setOnInsert ) $ setOnInsert插入新记录(然后执行$ set ) 我不知道这一点,并认为只有一名操作员会工作。这样我就可以消除重复的字段