【问题标题】:How to check if field value exists in collection如何检查集合中是否存在字段值
【发布时间】:2015-10-14 23:31:30
【问题描述】:

我在用户页面上有一个表单,它调用一个方法“newDiscussion”来在登录用户(以下简称:user1)和他们所在页面的用户(以下简称:user2)之间创建一个新的讨论对象。它还创建了一个带有与新创建的讨论对象匹配的讨论 ID 的消息对象。

在讨论对象中,我存储了 user1._id 和 user2._id。

我想检查现有讨论对象是否包含这两个用户 ID。如果为 false,则按照上述方法进行操作,否则只需插入消息并使讨论 ID 与现有讨论对象 ID 匹配。

【问题讨论】:

  • 你如何更新讨论?
  • 我需要先找到讨论 - 这是为了停止创建另一个已经包含两个用户 ID 的讨论。
  • 没有任何代码就不可能提供任何真正的帮助。理论上,创建一个变量来保存讨论,解析现有的讨论对象并查找这 2 个 id。如果找到它们,则填充刚刚创建的讨论变量并退出循环。在循环之后,如果讨论对象未定义,则将其实例化为讨论对象。
  • 您可以在单个操作中查找或创建。看看这个:docs.mongodb.org/manual/reference/method/…

标签: javascript mongodb meteor


【解决方案1】:

假设您已经将讨论发布给您的客户,您可以像这样在您的客户代码中使用collection.findOne 方法

var dicussion = Discussions.findOne({'user1._id': Meteor.userId(), 'user2._id': 'another user id'});

if (discussion) {
    // do some updates, if necessary
}
else {
    // else create a new discussion
}

【讨论】:

  • findOne 是否返回真/假或找到的文档对象?我正在使用您的代码,但发生了一些奇怪的事情,if 和 else 语句都在执行。当我试图弄清楚这一点时,为了让事情变得简单,if 语句是 console.log('Discussion exists') 和 else console.log('No Discussion')。但是当我调用这个方法(这是服务器端代码)时,if 语句输出到 Meteor 控制台日志,else 语句输出到浏览器控制台。这是完整的 Meteor.methods 代码 - link - 感谢您在我学习时提供的帮助!
  • 首先要注意的是,客户端正试图对您的方法进行乐观运行。这可能是因为您在共享位置定义了您的方法(这意味着它对服务器和客户端都可见)。客户端乐观地运行该方法,但仍将等待来自服务器的响应。在您的情况下,客户端的 minimongo 中没有 Discussions 文档(我们需要使用 pub/sub 来解决此问题),但服务器始终可以访问 Discussions 集合。现在,我们需要讨论您想要返回浏览器的内容(例如文档或布尔值)
  • 如果要返回文档,应该使用发布/订阅 Meteor 功能;否则,您可以只返回真/假,客户端可以做出相应的响应。这是您做出决定时要考虑的事情... Meteor 执行唯一的用户名验证服务器端(使用 Meteor.methods)并向客户端而不是用户文档返回真/假值。这是首选,因为他们不想将用户文档暴露给客户端。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 2019-12-28
  • 1970-01-01
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
相关资源
最近更新 更多