【发布时间】:2018-03-01 05:05:25
【问题描述】:
我有一个查询,我首先要匹配找到匹配用户的列表,然后从传入的外部用户数组中过滤掉匹配项,这样我就得到了尚未匹配的用户 ID。
这是一个匹配模式:
const mongoose = require('mongoose'); // only match two users at a time.
const Schema = mongoose.Schema;
const MatchSchema = new Schema({
participants: [{
type: String, ref: 'user'
}],
blocked: {
type: Boolean,
default: false
}
});
这是带有解释的查询:
db.getCollection('match').aggregate([
{
'$match': {
'$and': [
{ participants: "599f14855e9fcf95d0fe11a7" }, // the current user.
{ participants: {'$in': [ "598461fcda5afa9e0d2a8a64","598461fcda5afa9e0d111111", "599f14855e9fcf95d0fe5555"] } } // array of external users that I want to check if the current user is matched with.
]
}
},
{
'$project': {
'participants': 1
}
},
这将返回以下结果:
{
"_id" : ObjectId("59c0d76e66dd407f5efe7112"),
"participants" : [
"599f14855e9fcf95d0fe11a7",
"599f14855e9fcf95d0fe5555"
]
},
{
"_id" : ObjectId("59c0d76e66dd407f5efe75ac"),
"participants" : [
"598461fcda5afa9e0d2a8a64",
"599f14855e9fcf95d0fe11a7"
]
}
接下来我想做的是将参与者数组从两个结果合并到一个数组中。
然后我想从外部用户数组中取出那些匹配的项目,这样我就剩下尚未匹配的用户 ID。
任何帮助将不胜感激!
【问题讨论】:
-
给定您问题中的行,这可能不是最好的示例数据集:“然后我想从外部用户数组中删除那些匹配的项目,这样我就剩下尚未匹配的用户 ID。”。那么你到底是什么意思呢?这是否意味着您期望从与查询匹配的文档中获得参与者的“唯一列表”,其中“其中不是查询本身提供的参数之一”?因此,您提供要匹配的值列表,然后您希望返回的每个值除了那些提供的值?
-
基本上我想做的是1:传入一个可能与当前用户匹配或不匹配的用户数组(数组X)。 2:查找匹配用户列表。 3:从(数组X)中删除匹配的用户列表。 4:返回未匹配的唯一用户列表。
标签: javascript mongodb mongoose mongodb-query aggregation-framework