2016-10-08 26 views
0

如何返回一组文档,每个文档不包含内部数组中的特定项目?返回不包含特定内部数组项目的MongoDB文档

我的数据方案是:

帖子:

{ 
    "_id" : ObjectId("57f91ec96241783dac1e16fe"), 
    "votedBy" : [ 
     { 
      "userId" : "101", 
      "vote": 1 
     }, 
     { 
      "userId" : "202", 
      "vote": 2 
     } 
    ], 
    "__v" : NumberInt(0) 
} 

我要返回一组帖子,非其中包含在任何votedBy数组项的定UserID的。 的正式文档意味着这是可能的:

MongoDB documentation: Field with no specific array index

虽然它返回一个空集(用于查找与特定阵列项目文档的更简单的情况下)。 看来我必须知道索引的正确结果集,如: votedBy.0.userId。

This问题是我发现的最接近,这种解决方案(适用于我的方案):

db.collection.find({"votedBy": { $not: {$elemMatch: {userId: 101 } } } }) 

它工作正常,如果阵列中只有内部文件相匹配的我希望不要回来,但在上面指定的示例情况下,文档返回,因为它找到了userId = 202内部文档。

只是为了澄清:我想返回所有文档,NONE的votedBy数组项具有给定的userId。

我也尝试过一个更简单的数组,只包含userId作为字符串数组,但仍然每个人都收到一个Id并且搜索过程也是一样的。

我尝试过的另一个解决方案是为uservotes使用不同的集合,并应用查找来执行类似SQL的连接,但似乎有一种更简单的方法。

我正在使用猫鼬(node.js)。

回答

1

上的嵌入式userId用户$ne

db.collection.find({'votedBy.userId': {$ne: '101'}}) 

它会过滤所有的文件与userId = "101"

+0

嗨@汤姆的至少一个元素,感谢您的回复。恐怕这不起作用(返回所有文档)。让我们来看一个更简单的例子: {'votedBy.userId':'101'} 只返回具有元素101的文档,但根本没有返回结果。 在我看来,原因是它只适用于'votedBy.0.userId'(例如我们应该遍历所有索引),但是在这种组合点方法中它找不到任何东西。 –

+1

@ Bobcat100它正在运行,我在3.2版本上测试过它(不知道关于旧版本),所以检查模式是否与问题完全相同,以及是否正确复制。你给的例子和'$ ne'的查询不一样。查询:'{'votedBy.userId':'101'}'将返回所有包含至少一个带有'101'的元素的文档,并且我的答案中的查询将返回文档,其中没有元素为'101' '。 – TomG

+0

这个例子确实不同,它表明在一个更简单的查询中,votedBy.userId不起作用。我不认为我有不同的版本,因为我使用最新的Azure documentDB,它应该支持这个版本。 你可以请检查我的例子:{'votedBy。userId':'101'}返回包含101的文档或者[]答案? 谢谢,巴拉克。 –

相关问题