在MongoDB或NoSQL数据库中无法在key返回中传递变量吗?
这是我的代码:
dob = 1
email = 1
nationality = 1
work = 1
situation = 1
skype = 1
user_id = ObjectId(self.get_argument("id"))
contact_id = ObjectId(self.get_argument("contactId"))
contact_confidentiality = db.cara.users.find_one({"_id" : contact_id}, {"profil.private.confidential" : 1})
confidentiality = []
for i in contact_confidentiality["profil"]["private"]["confidential"]:
if i == "dob":
dob = 0
elif i == "email":
email = 0
elif i == "nationality":
nationality = 0
elif i == "work":
work = 0
elif i == "situation":
situation = 0
elif i == "skype":
skype = 0
elif i == "facebook":
facebook = 0
contact = db.cara.users.find_one({"_id" : contact_id}, {"profil.private.first_name": 1, "profil.private.last_name": 1, "profil.gender": 1, "profil.dob": dob, "profil.nationality": nationality, "profil.work": work, "profil.private.email_address": email, "profil.private.situation": situation, "profil.private.skype": skype})
MongoDB不想接受我代码的最后一行:dob, nationality, work, email。我该如何传递这些变量呢?
编辑:
contact_confidentiality = db.cara.users.find_one({"_id" : contact_id}, {"profil.private.confidential" : 1})
projection = {
'profil.private.first_name' :1 ,
'profil.private.last_name' : 1,
'profil.gender' : 1,
'profil.dob' : 1,
'profil.private.email_address' : 1,
'profil.nationality' : 1,
'profil.work' : 1,
'profil.private.situation' : 1,
'profil.private.skype' : 1,
'profil.facebook' : 1
}
for i in contact_confidentiality["profil"]["private"]["confidential"]:
i_json = self._doc_to_json(i)
logging.info(i_json)
del projection[i_json] # I need a key like "profil.nationality" but my key is "nationality"
contact = db.cara.users.find_one({"_id" : contact_id}, projection)
1 个回答
0
现在有个限制,就是在一个查询中,你只能选择包含某些字段,或者排除某些字段,但不能同时做这两件事。所以如果你要传递一个查询的字段列表,它们要么全是1,要么全是0。
不过有一个例外,就是当你使用覆盖索引时,你可以排除_id字段,同时包含其他字段。
目前有一个请求,希望能让你在查询中同时包含和排除字段,但这个功能还没有实现。你可以查看一下这个链接:http://jira.mongodb.org/browse/SERVER-391
针对上面查询中的具体问题,我建议你换个方式来写查询……与其通过设置1和0来创建字段列表,不如直接构建一个只包含你想要的字段,其他的都不包含。例如,可以这样写:
user_id = ObjectId(self.get_argument("id"))
contact_id = ObjectId(self.get_argument("contactId"))
contact_confidentiality = db.cara.users.find_one({"_id" : contact_id}, {"profil.private.confidential" : 1})
projection = {
'profil' : {
'private' : {
'first_name': 1,
'last_name':1,
'gender':1,
'dob' : 1,
'email' : 1,
'nationality': 1,
'work' : 1,
'situation' : 1,
'skype' : 1,
'facebook' : 1
}
}
}
for i in contact_confidentiality["profil"]["private"]["confidential"]:
projection['profil']['private'].remove(i)
contact = db.cara.users.find_one({"_id" : contact_id}, projection)