2015-09-07 104 views
3

我有一个用户模式是这样的:

user : { 
     myArmy : { 
      mySoldiers : [ 
       { 
        positioned : false, 
        soldierInfo : { 
         _id : s99212 
        } 
       }, 
       { 
        positioned : true, 
        soldierInfo : { 
         _id : s99112 
        } 
       } 
      ] 
     } 
    }, 
    user : { 
     myArmy : { 
      mySoldiers : [ 
       { 
        positioned : true, 
        soldierInfo : { 
         _id : s99212 
        } 
       }, 
       { 
        positioned : false, 
        soldierInfo : { 
         _id : s99112 
        } 
       } 
      ] 
     } 
    } 

    ... 

我有我想要做回谁已经战士ID s99212定位用户(S)(真)查询:(可能是成千上万的那些,我需要阅读和检索它们全部)

这是我与猫鼬故障查询:

var soldierId = s99212; 


stream = User.find({ 
      $and: [ 
       {'myArmy.mySoldier.positioned': {$ne: null}}, 
       {'myArmy.mySoldier.soldierInfo._id': soldierId} 
      ] 
     }).lean(true).stream(); 

没有被该查询返回的,应该有另一种方式来做到这一点$之类的东西?

究竟是如何我想使用$ elemMatch,如果在所有,它应该而不是发现? (如果它值得一提的,我想回到完整的用户对象,不只是它的一部分...)

试过,坠毁我的应用程序:

stream = User.find({ 
     '$elemMatch': [ 
      {'myArmy.mySoldiers.pos': {$ne: null}}, 
      {'myArmy.mySoldiers.soldierInfo._id': soldierId} 
     ] 
    }).lean(true).stream(); 

我知道我有一个小小的语法问题在哪里?

+0

[只检索MongoDB集合中对象数组中的查询元素]的可能重复(http://stackoverflow.com/questions/3985214/retrieve-only-the-queried-element-in-an-object-array -in-mongodb的收集)。在查询中使用'$ elemMatch'解决方案需要应用于相同的数组元素。这就是'$ elemMatch'所做的。 –

+0

我不认为$ elemMatch应该在我的情况下,我需要完整的用户对象,如果士兵身份证是由这个结构定位,你会介意让我直吗? – totothegreat

+0

您正在阅读的错误答案。查看文档中的['elemMatch'](http://docs.mongodb.org/master/reference/operator/query/elemMatch/),然后再查看答案。请记住,“你”是要求知道更好的人的建议的人。 'elemMatch'是你在这里需要匹配元素上的两个属性。不以任何方式改变对象。 –

回答

3

非常简单,有据可查。所述$elemMatch操作者作为“本身查询”,在那里,它适用“它的条件”所指定的数组的成员:

var query = User.find({ 
    "myArmy.mySoldiers": { 
     "$elemMatch": { 
      "positioned": { "$ne": null }, 
      "soldierInfo._id": soldierId 
     } 
    } 
}); 

因此为一个文件以“匹配”然后$elemMatch下specfied的条件必须存在并对“相同”数组元素有效。 “左”的数组,“右”的参数。

其他“点符号”形式只有曾测试数值与数组中的“某个元素”相匹配,而不一定是相同的。

+0

我爱你!我只是忘了那些:myArmy.mySoldiers, – totothegreat

+0

@totothegreat如何回到并在你的[其他问题](http://stackoverflow.com/q/32433412/5031275)有一个“红热去”。现在你对语法有了更多的了解,它应该很容易解决。或者至少得到“一部分”的方式。 –

+0

你是对的,现在第2部分开始,给我几个即时通讯要为你建立另一支军队 – totothegreat