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

MongoDB: $addToSet duplicate result callback in Meteor

本文关键字:结果 回调 addToSet Meteor MongoDB      更新时间:2023-09-26

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

我发现的最接近的一个是如何检查Mongo的$addToSet是否重复,但我不知道如何在流星中获得db对象。

正如在其他文章中所写的,作为更新方法最后一个参数的回调函数总是返回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对象始终相同:

RESULT: {
  "ok":1,
  "writeErrors":[],
  "writeConcernErrors":[],
  "nInserted":0,
  "nUpserted":0,
  "nMatched":1,
  "nModified":null,
  "nRemoved":0,
  "upserted":[]
}

感兴趣的值nModified对于更新和(发现重复)跳过都保持null

有什么想法吗?

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

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

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

db.collection.find({array_key: object_to_find_in_array})

看看它是返回一个对象还是什么都不返回。然后根据需要进行更新。