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

时间:2015-03-06 03:26:22

标签: javascript mongodb meteor

有很多$ addToSet主题,但经过一个小时的搜索后,我仍然不知道如何在meteor-serverside -javascript代码中评估如果$ addToSet为数组添加了一个新元素,或者它是一个重复比赛。

我找到的最接近的是How to check if Mongo's $addToSet was a duplicate or not,但我不知道如何在流星中获取数据库对象。

正如其他帖子中所写,作为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对象仍然是相同的:

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

有趣的值nModified保留null以进行更新和(重复找到)跳过。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果我重新说出这个问题,你就试图弄清楚你要插入的内容是否已经存在。

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

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

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

并查看它是否返回一个对象。然后根据需要进行更新。