我的藏品中有以下物品:
> db.test.find().pretty()
{ "_id" : ObjectId("532c471a90bc7707609a3d4f"), "name" : "Alice" }
{
"_id" : ObjectId("532c472490bc7707609a3d50"),
"name" : "Bob",
"partner_type1" : {
"status" : "rejected"
}
}
{
"_id" : ObjectId("532c473e90bc7707609a3d51"),
"name" : "Carol",
"partner_type2" : {
"status" : "accepted"
}
}
{
"_id" : ObjectId("532c475790bc7707609a3d52"),
"name" : "Dave",
"partner_type1" : {
"status" : "pending"
}
}
有两种合作伙伴类型:partner_type1
和partner_type2
。用户不能是两种类型的接受合作伙伴。但是他可以成为partner_type1
中被拒绝的合作伙伴,但在另一个中被接受,例如。
如何构建提取可以成为合作伙伴的用户的Mongo查询?
答案 0 :(得分:1)
如果您的用户只能在一个合作伙伴类型中接受,则应该将其转为:拥有字段accepted_as:"partner_type1"
或accepted_as:"partner_type2"
。对于尚未被接受的人,要么没有这样的字段,要么将其设置为null
。
在这两种情况下,您获得任何未被接受的查询将是:
{
data.accepted_as: null
}
(null匹配非现有字段以及显式设置为null的字段)
答案 1 :(得分:0)
对我来说,逻辑架构是这样的:
"partner : {
"type": 1,
"status" : "rejected"
}
至少可以保持文档之间的路径一致。
因此,如果您不想使用mapReduce类型方法来查找它所在的“哪个字段”,否则使用普通查询和聚合管道,则不要改变文档上的字段路径。如果您更改“数据”,那么这是最一致的形式。