所以说我有一系列文件。每个文档都包含主要和次要地址,例如......
{
primaryAddress: "94-111",
secondaryAddress: "94-111"
}
我想要做的是,查询主要地址为" 94-111"但排除primaryAddress等于secondaryAddress的所有结果。
我尝试了以下但没有运气。
db.address.find({primaryAddress:"94-111", secondaryAddress: {$ne this.primaryAddress}})
答案 0 :(得分:1)
要比较文档中的两个字段,请使用聚合框架:
db.addresses.aggregate({
$project: {
primaryAddress: '$primaryAddress',
secondaryAddress: '$secondaryAddress',
eq: {$eq: ['$primaryAddress', '$secondaryAddress']}
}
}, {
$match: {eq: false}
})
管道的$project
阶段将主要和次要地址带入下一阶段,并添加一个字段eq
,如果字段相等则为true
且{ {1}}否则。
false
阶段获取第一阶段处理的文档,并过滤掉$match
为eq
的文档。
此聚合管道将比true
子句快得多,后者在服务器上为每个文档执行Javascript。
答案 1 :(得分:0)
尝试这样的事情
db.address.find(
{ $where: "this.primaryAddress == '94-111' &&
this.primaryAddress != this.secondaryAddress" } );
应该等同于
db.address.find(
{ $where: "this.primaryAddress == '94-111' &&
this.secondaryAddress != '94-111'" } );
如果您愿意,可以删除where运算符,请参阅here。
答案 2 :(得分:0)
如果你想要的文件,其中primaryAddress =" 94-111" AND secondaryAddress<> " 94-111",试试这个:
db.address.find({primaryAddress:"94-111", secondaryAddress: {$ne: "94-111"}})
如果您需要primaryAddress<>的文档secondaryAddress,请参阅@ Jesse的解决方案