值不是X的项目字段

时间:2015-10-27 02:09:05

标签: mongodb mongodb-query aggregation-framework

我有一个Mongo集合,其架构是

{
  _id:...
  user1: ...
  user2: ...
  date: ...
}

我想创建一个查询,在给定用户的情况下,该查询将返回该用户遇到的所有其他用户的列表。到目前为止,我得到的是

db.collections.find({$or:[{user1: XXX}, {user2: XXX}]}, <projection>);

我喜欢做的是让投影看起来像

{user1: $user1==XXX, user2: $user2==XXX}

$user1/2是该文档中用户1或2的值,但我不知道如何将其转换为mongo查询。也许这可以使用$where完成,但我无法在投影中找到$where的语法。

1 个答案:

答案 0 :(得分:1)

不完全清楚你的意思,但是$where不是一个选项,因为它只是一个JavaScript评估&#34;查询&#34;的条件。并且与投影无关。

你似乎要求&#34;识别&#34;哪个领域实际上符合您的条件或至少类似的东西。标准查询投影不会以任何方式更改文档中存在的值,但.aggregate()方法具有$project可以更改文档内容。

因此,要确定匹配的字段,您可以这样做:

db.collections.aggregate([
    { "$match": { 
        "$or": [
            { "user1": "XXX" },
            { "user2": "XXX" }
        }
    }},
    { "$project": {
        "matched": {
            "$cond": [
                { "$ne": [ "$user1", "XXX" ] },
                "$user2",
                "$user1"
            ]
        }
    }}
])

$cond运算符提供三元(if / then / else)条件,将logical comparison operator计算为第一个参数,并返回第二个参数true或第三个参数false

所以在这种情况下,假设$or可以匹配任一字段,那么返回的值将是具有匹配值的字段,如果不是&#34; user1&#34则是合乎逻辑的;然后它一定是&#34; user2&#34;因为那些是最初的查询条件。

无论您的情况如何,您希望这种逻辑评估通过检查条件的现有值来返回文档中实际不存在的另一个值。