除了.findAndModify之外我应该使用什么?

时间:2015-04-05 04:08:35

标签: meteor

我有以下代码:

var roomDoc = Rooms.findAndModify({
  query: {name: roomName},
  update: {$setOnInsert: {unixTimestamp: unixTimestampSeconds()}},
  new: true,
  upsert: true
});

在收到.findAndModify is undefined错误后,我意识到,Meteor并没有实现.findAndModify

是否有通过使用不同查询实现类似功能的Meteor方式?

3 个答案:

答案 0 :(得分:4)

然而,上面的答案解释了这种特殊情况,在许多其他情况下,假设findAndModify是一个原子操作,可用于生成唯一ID:

http://docs.mongodb.org/v3.0/tutorial/create-an-auto-incrementing-field/

似乎Meteor不会实现findAndModify的包装,因为相应的票证已经关闭,但是社区提出了几个已经在服务器和客户端都可以使用的解决方案:

https://github.com/meteor/meteor/issues/1070

答案 1 :(得分:2)

您可以直接执行此操作,语法略有不同。

var roomDoc = Rooms.rawCollection().findAndModify(
  { name: name }, 
  [], 
  { $setOnInsert: {unixTimestamp: unixTimestampSeconds()} }, 
  { new: true, upsert: true }
)

更多信息:

https://forums.meteor.com/t/automatically-increment-order-numbers/11261/12

答案 2 :(得分:0)

单独执行find()upsert()并不是明显的事情。

Rooms.upsert({name: roomName}, {$setOnInsert: {unixTimestamp: unixTimestampSeconds()}};
var roomDoc = Rooms.findOne({name: roomName});

这可能会因为两次db调用而效率稍低,但如果困扰你,只需使用Rooms.rawCollection()为Mongo的findAndModify()编写自己的流星包装器。