【问题标题】:Mongodb: Find documents with array where at least one element does not match ObjectIDMongodb:查找具有至少一个元素与ObjectID不匹配的数组的文档
【发布时间】:2016-03-24 06:02:00
【问题描述】:

我正在为一个 MongoDB 请求而苦苦挣扎。我有一个 Play 架构,其中包含一组 Move 对象。每个Move 对象都以ObjectID 的形式保存对Player 的引用。关注this question我试着做

{ 'moves.player': { $elemMatch : { $ne : playerId } } }

playerId 拥有一个 ObjectID。但是我得到了错误

Error: Can't use $elemMatch with ObjectId

我也尝试了以下

{ 'moves.player.str': { $elemMatch : { $ne : playerId.toString() } } }

但它没有找到合适的文件...有什么想法吗?

示例

一些Play记录:

A = {
    "moves": [
        { player: { $oid: "56f32fe2f41638de3b3e4773" } },
        { player: { $oid: "56f32fe2f41638de3b3e4774" } }
    ]
}
B = {
    "moves": [
        { player: { $oid: "56f32fe2f41638de3b3e4773" } }
    ]
}

playerId = "56f32fe2f41638de3b3e4773" 的查询应该只返回对象 A,因为它是唯一一个具有一系列动作的对象,其中至少有一个玩家不同于 56f32fe2f41638de3b3e4773

【问题讨论】:

  • 不幸的是。即使您找到了自己的解决方案(或者至少您认为自己找到了),这个问题也不会显示您实际上正在查询的文档结构。因此,作为示例对任何人都没有多大用处,并且是一个非常不清楚的问题。显示您希望匹配的示例文档会更好。
  • 好建议,添加了一个例子,这可能有助于理解问题。被这个卡住了很长时间,所以我怀疑它可能对其他人有用。

标签: node.js mongodb


【解决方案1】:

好的,找到问题出在哪里了……就这样做

{ "moves": { $elemMatch: { "player": { $ne : playerId } } } }

效果很好!

【讨论】:

  • 很确定,如果您的数据看起来像我“认为”的那样(已经告诉您,在没有样本的情况下提出问题让其他人解决问题是不好的),那么只需 { "moves.player": { "$ne": playerId } } 就足够了。当需要满足属性的“两个或多个”条件时,您只需要$elemMatch。单一属性检查可以用简单的“点符号”来完成。
  • $ne 不会返回Play 记录,其中moves 之一被分配给具有playerId 的玩家,因此在我的示例中既不会返回A 也不会返回B.. .
  • 啊。现在我懂了。您的答案是正确的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 2016-02-17
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
相关资源
最近更新 更多