【发布时间】:2016-02-24 18:12:36
【问题描述】:
我正在尝试在 Meteor 中返回一个光标(使用 MongoDB)。
我正在寻找参与者字段与我传入的数组完全匹配的文档(MessageThreads 集合)。
下面是一个示例 MessageThread 文档
{
"_id": "YYSELCguhLurTeyNY",
"creator": "RLmnidY6GypdqDXZu",
"participants": [
"SNhRq4vQpwFBjnTSH",
"RLmnidY6GypdqDXZu"
],
}
当我执行 addMessage 方法时,我首先尝试检查是否存在participants 与我传入的数组完全匹配的线程。该数组将根据新消息表单tofield 制定。
因此,只有当我的所有 participants 数组都在文档 participants 字段内但没有其他字段时,才应返回文档。例如:如果文档中存在不属于新消息to 字段的第三人,则不应返回该文档。
目前这是我的查询,显然太简单了。
existingThread = MessageThreads.findOne(participants: participants)
有什么建议吗?谢谢
编辑:我在使用提供的重复答案时遇到问题(但还不允许评论其他线程)
由于某种原因,如果数组不同,existingThread 仍在查找文档,但 size 为真。
编辑 2:
下面是我的整个方法的代码,它可以帮助破译我哪里出错了。在咖啡脚本中(请原谅标签,无法让它在 SO 中工作,抱歉)。
Meteor.methods
newMessage: (recipientIds, messageContent) ->
if !Meteor.userId()
return false
userId = Meteor.userId()
check recipientIds, [String]
check messageContent, String
participants = recipientIds
participants.push(userId)
participantCount = _.size(participants)
existingThread = MessageThreads.findOne participants:
$size: participantCount
$in: participants
if existingThread?
console.log "Thread exists: #{existingThread._id}"
MessageThreads.update existingThread,
$addToSet: messages: {sender: userId, content: messageContent}
$set: lastUpdated: new Date()
else
newThreadId = MessageThreads.insert
creator: userId
participants: participants
messages: [
{
sender: userId
content: messageContent
createdAt: new Date()
}
]
lastUpdated: new Date()
return newThreadId
【问题讨论】:
-
从谷歌搜索
mongodb array exact match开始。这揭示了许多有用的答案。 -
非常感谢,您是对的,我显然搜索效率不高!这个 SO question 似乎有一个这样的答案。 stackoverflow.com/questions/29774032/…
-
:P 很好的发现,忘记了这个答案可以很好地适用于你的情况。
-
没看到也是你的回答谢谢!
-
事实证明,将 $all 与 $size 结合起来似乎可以解决问题。