按多个字段和子字段过滤Mongo项目

时间:2014-03-21 14:36:08

标签: mongodb

我的藏品中有以下物品:

> 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_type1partner_type2。用户不能是两种类型的接受合作伙伴。但是他可以成为partner_type1中被拒绝的合作伙伴,但在另一个中被接受,例如。

如何构建提取可以成为合作伙伴的用户的Mongo查询?

2 个答案:

答案 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类型方法来查找它所在的“哪个字段”,否则使用普通查询和聚合管道,则不要改变文档上的字段路径。如果您更改“数据”,那么这是最一致的形式。