在MongoDB或NoSQL数据库中无法在key返回中传递变量吗?

0 投票
1 回答
596 浏览
提问于 2025-04-16 11:53

这是我的代码:

    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)

撰写回答