Javascript MongoDB:$addToSet Meteor中的重复结果回调

Javascript MongoDB:$addToSet Meteor中的重复结果回调,javascript,mongodb,meteor,Javascript,Mongodb,Meteor,有很多$addToSet主题,但是经过一个小时的搜索,我仍然不知道如何在meteor服务器端javascript代码中评估$addToSet是否向数组添加了新元素,或者是否是重复匹配 我发现的最近的一个是,但我不知道如何在meteor中获得db对象 正如在其他文章中所写的那样,回调函数作为update方法的最后一个参数总是返回1,并且它总是成功的,无论它是重复的还是不同的元素 如果目前没有解决方案,我想知道是否有其他方法可以检查特定元素的嵌套数组(在一个特定集合中)。一个简单的真/假结果信息就足

有很多$addToSet主题,但是经过一个小时的搜索,我仍然不知道如何在meteor服务器端javascript代码中评估$addToSet是否向数组添加了新元素,或者是否是重复匹配

我发现的最近的一个是,但我不知道如何在meteor中获得db对象

正如在其他文章中所写的那样,回调函数作为update方法的最后一个参数总是返回1,并且它总是成功的,无论它是重复的还是不同的元素

如果目前没有解决方案,我想知道是否有其他方法可以检查特定元素的嵌套数组(在一个特定集合中)。一个简单的真/假结果信息就足够了

编辑:

好的,我现在通过以下几行实现了批量更新:

var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;
var col = db.collection("posts");
var batch = col.initializeOrderedBulkOp();
batch.find({_id: postid}).upsert().updateOne({"$addToSet": ...});
batch.execute(function(err, result) {
  if (err) throw err;
  console.log("RESULT: ", JSON.stringify(result));
  //db.close();
});</code>
$addToSet可用于此实现,但执行返回的
结果
对象始终相同:

RESULT: {
  "ok":1,
  "writeErrors":[],
  "writeConcernErrors":[],
  "nInserted":0,
  "nUpserted":0,
  "nMatched":1,
  "nModified":null,
  "nRemoved":0,
  "upserted":[]
}
有趣的值
nModified
保持为
null
用于更新和(找到重复项)跳过


有什么想法吗?

如果我重新表述这个问题,你是想知道你要插入的内容是否已经存在

为什么不在尝试插入之前简单地查询对象

如果你有一个集合(数组),你可以简单地

db.collection.find({array\u key:object\u to\u find\u in\u array})


然后看看它是否返回一个对象或什么都没有。然后根据需要进行更新。

正确的答案是引用批量更新操作的答案,因为这是唯一的写入结果,它将实际告诉您文档是否通过操作进行了修改,如果“集合成员”已存在,则文档未被修改。您可以在meteor的“服务器端”代码中使用它,但是您不能在“客户机”代码中编写直接调用,因为它在那里不受支持,而且可能不应该。查找将
.aggregate()
.publish()
等操作包装在一起的问题,以获取使用“publish”公开要从客户端调用的操作的示例。@mohoff您找到这个问题了吗?@Gaelan没有,我更改了它周围的代码和模型,因此我不再依赖于该检查。但它可能与支持MongoDB 3.0的新Meteor 1.1版本配合使用。你能测试一下吗?对不起,我不容易复制