首页 > 解决方案 > 处理字段名称中的空格

问题描述

这是该系列的外观:

{
"resident_ID": "23mgomeg3gmf32a",
"membership": "Bronze",
"Former City": "SARATOGA SPRINGS",
"Current City": "WHITE PLAINS"
}
// ----------------------------------------------
{
"resident_ID": "042tj03mf23ftwf",
"membership": "Gold",
"Former City": "NIAGRA FALLS",
"Current City": "NEW ROCHELLE"
}
// ----------------------------------------------
{
"resident_ID": "0rd86tx60pxfv5o",
"membership": "Bronze",
"Former City": "NIAGRA FALLS",
"Current City": "NIAGRA FALLS"
}
// ----------------------------------------------
{
"resident_ID": "v3g8myx7ltw4j77",
"membership": "Gold",
"Former City": "SARATOGA SPRINGS",
"Current City": "SARATOGA SPRINGS"
}

我想创建一个查询,该查询仅返回那些没有相同的前城市和当前城市的人的 resident_ID,用于拥有金牌会员资格的人,同时忽略缺失值。在 SQL 中,这相当于:

SELECT resident_ID, [Former City], [Current City]
FROM tbl_ReportedResidence
WHERE [Former City]=[Current City] AND membership='Gold' 
AND [Former City] IS NOT NULL
AND [Current City] IS NOT NULL;

因此,预期的输出将是:

resident_ID       Former City     Current City
042tj03mf23ftwf   NIAGRA FALLS    NEW ROCHELLE

我尝试过使用以下内容,但他们会返回所有具有 Gold 会员资格和非空值的 resident_ID,同时忽略不等于检查前城市和当前城市:

db.getCollection("tbl_ReportedResidence").find(
{
"membership" : "Gold",
"Current City" : {
"$ne" : null
},
"Former City" : {
"$ne" : null
},
"$where" : "'Former City' != 'Current City'"
},
{
"resident_ID" : 1.0,
"Former City" : 1.0,
"Current City" : 1.0
}
);

我也尝试更换

"$where" : "'Former City' != 'Current City'"

基于之前的问题,我发现这似乎在问同样的事情:

"$expr": {"$ne": ["Former City", "Current City"]}

但不知何故,似乎没有任何效果,我一直得到相同的结果,忽略了我尝试过滤输出以仅包含不具有相同非空前城市和当前城市的文档!

编辑:由于事实证明我的方法不正确,我重命名了这个问题,以突出我的实现的潜在问题,以供未来可能遇到相同问题的人使用。

标签: mongodb

解决方案


首先要注意:您为自己增加了难度,选择了带有空格的属性名称。

现在,进入查询问题:有问题的属性,当使用 时$where,需要在前面加上this. this.Current City而且由于空间的原因,您将无法使用点符号。您需要使用括号(例如this['Current City'].

所以你的查询需要是这样的:

db.users.find(
  {membership:"Gold",
   "Current City": { $ne: null},
   "Former City": { $ne: null},
   $where: "this['Current City'] == this['Former City']"
  })

如果您将属性重命名为没有空格,事情会变得更简单,因为您不需要到处都有那么多引号。例如,使用currentCityand formerCity

db.users.find(
  {membership:"Gold",
   currentCity: { $ne: null},
   formerCity: { $ne: null},
   $where: "this.currentCity == this.formerCity"})

推荐阅读