2

以下代码有效,它的作用是:它从缓冲区读取并附加到 Mongo 中的“s”字段,但每次我通过循环时都会调用数据库:

bsonData = BSON("$push"<<BSON("s" << BSON("r" << (unsigned int)RecordNumber << "t" << Variant << "u" << TimeStamp << "v" << Value)));

我想做的是用 4 个值填充一个向量,然后在一次调用中将该向量插入到数据库中,我试过这个:

for(i=0;i<vRecNo.size();i++)
{
    bOB.append("s", BSON("r" << (unsigned int)vRecNo[i] << 
                            "t" << (unsigned int)vType[i] << 
                            "u" << (unsigned int)vTimeStamp[i] << 
                            "v" << (unsigned int)vValue[i]));
}

但在 Mongo 中创建了重复的“s”字段。非常感谢您的帮助,在此先感谢您。

4

3 回答 3

5

我不完全清楚你在问什么,但从标题来看,我会尽力提供帮助。

使用 C++ 在 mongo 中创建 BSON 数组有两种方法:

  1. 像 BSON 宏一样使用 BSON_ARRAY 宏,但没有键。例如。

    BSONArray arr = BSON_ARRAY( "hello" << 1 << 2 << BSON( "foo" << BSON_ARRAY( "bar" << "baz" << "qux" ) ) );

    上面的示例将创建一个具有四个值的数组,其中最后一个元素是具有 3 个数组值的 BSON 文档

    [“你好”, 1, 2, { foo : [“bar”, “baz”, “qux”] } ]

  2. 使用 BSONArrayBuilder 构建没有宏的数组。例如。

    BSONArrayBuilder b; BSONArray arr = b.append(1).append(2).arr();

    这将创建一个包含 2 个值的数组 [ 1, 2 ]

因此,在您的事业中,如果您想创建一个具有 4 个值的向量,您应该使用上述方法之一创建一个数组,将该数组分配给“s”,然后插入结果文档。这会给你这种形式的东西 { s : [ value1, value2, value3, value4 ] }

于 2012-09-17T18:41:15.173 回答
1

谢谢你的提示,我终于想通了,我发布了一段对我有用的代码:

   BSONObjBuilder bOb;
   BSONArrayBuilder bArr;
   for(i=0;i<vRecNo.size();i++)
    {
      BSONObj bo = BSON("r" << (unsigned int)vRecNo[i] << "t" << vType[i] << "u" << (unsigned int)vTimeStamp[i] << "v" << vValue[i]);
      bArr.append(bo);
    }
  bOb.append("s", bArr.arr());
  BSONObj bsonData = BSON("$set" << bOb.obj());

  conn.update("DatabaseName.Collection", qryData, bsonData);
于 2012-09-18T17:25:14.893 回答
0

您可以将向量转换为 std::list 并附加列表:

std::list<std::string> aList(aVec.begin(),avec.end())
BSONArrayBuilder arrBuilder;
arrBuilder.append(aList);

奇怪的是,您可以附加 std::list 但不能附加 std::vec。

于 2015-10-19T12:16:41.923 回答