Mongodb 两个字段匹配的Mongo聚合
我有一个工作聚合,其中字段和计算值之间进行了匹配。但后来我意识到我需要通过两个计算值进行搜索,所以我引入了两个新字段。我需要用这两个匹配项进行聚合,但我无法构造mongo查询。要么什么都不匹配,要么什么都匹配。我被困住了,因为我已经尝试了太多的可能性。你能找出我做错了什么吗 数据模型:Mongodb 两个字段匹配的Mongo聚合,mongodb,Mongodb,我有一个工作聚合,其中字段和计算值之间进行了匹配。但后来我意识到我需要通过两个计算值进行搜索,所以我引入了两个新字段。我需要用这两个匹配项进行聚合,但我无法构造mongo查询。要么什么都不匹配,要么什么都匹配。我被困住了,因为我已经尝试了太多的可能性。你能找出我做错了什么吗 数据模型: db.items.find({"info.slug": "otaceni-na-dalnici"}); { "_id" : "1e44kgsl1s", "info" : { "slug" : "otaceni-n
db.items.find({"info.slug": "otaceni-na-dalnici"});
{ "_id" : "1e44kgsl1s", "info" : { "slug" : "otaceni-na-dalnici"}, "votes_count" : 9 }
db.poll_votes.find({poll: "1e44kgsl1s", user: "1e41795qjw"});
{ "_id" : "1e44kgsl1s_1e41795qjw", "poll" : "1e44kgsl1s", "user": "1e41795qjw", "vote" : "dislike"}
原始查询:
db.items.aggregate([{$match: {"info.slug": "otaceni-na-dalnici"}},
{$lookup: {
from: 'poll_votes',
let: {poll_id: "$_id"},
pipeline: [{$match: {$expr: {$eq: ["$_id", {$concat: ["$$poll_id", "_1e41795qjw"]}]}}},
{$project: {_id: 0, vote: "$vote"}}],
as: "me"
}}]).pretty();
及其简化的响应:
{
"_id" : "1e44kgsl1s",
"info" : {
"slug" : "otaceni-na-dalnici",
},
"votes_count" : 9,
"me" : [{"vote" : "dislike"}]
}
使用轮询
和用户
字段的新查询
db.items.aggregate([{$match: {"info.slug": "otaceni-na-dalnici"}},
{$lookup: {
from: 'poll_votes',
let: {poll_id: "$_id"},
pipeline: [{$match: {$expr: {$and: [{poll: "$$poll_id"}, {user: "1e41795qjw"}]}}},
{$project: {_id: 0, vote: "$vote"}}], as: "me"
}
}]);
但是,尽管有$和
操作符,但它会为所有用户返回投票
{
"_id": "1e44kgsl1s",
"info": {"slug": "otaceni-na-dalnici"},
"votes_count": 9,
"me": [{"vote": "dislike"}, {"vote": "neutral"}, {"vote": "neutral"}, {"vote": "neutral"}, {"vote": "hate"}, {"vote": "neutral"}, {"vote": "trivial"}]
}
怎么了?我尝试设置mongo沙箱,但它无法识别我的聚合查询。以下是测试数据
db={
"items": [
{
"_id": "1e44kgsl1s",
"info": {
"slug": "otaceni-na-dalnici"
},
"votes_count": 9
}
],
"poll_votes": [
{
"_id": "1e44kgsl1s_1e41795qjw",
"poll": "1e44kgsl1s",
"user": "1e41795qjw",
"vote": "dislike"
},
{
"_id": "xyz",
"poll": "1e44kgsl1s",
"user": "abc",
"vote": "dislike"
},
{
"_id": "ijk",
"poll": "1e44kgsl1s",
"user": "qwerty",
"vote": "dislike"
},
]
}
您在
$expr
中混合了普通mongo查询语言和聚合运算符
需要变量的谓词应该在$expr
内,而普通谓词不应该:
db.items.aggregate([
{$match: {"info.slug": "otaceni-na-dalnici"}},
{$lookup: {
from: 'poll_votes',
let: {poll_id: "$_id"},
pipeline: [
{$match: {$and: [
{$expr: {$eq:["$poll", "$$poll_id"]}},
{user: "1e41795qjw"}
]}}
}},
{$project: {_id: 0, vote: "$vote"}}], as: "me"}
}]);
游乐场中的查询正常,答案中的查询有语法错误。谢谢你的提示。我将研究一个差异。我误解了一个文档:$match阶段需要使用$expr操作符来访问变量