展开时字段名称冲突 (_id)

Posted

技术标签:

【中文标题】展开时字段名称冲突 (_id)【英文标题】:Field name collision (_id) when doing unwind 【发布时间】:2019-02-17 07:39:10 【问题描述】:

我有 mongo 集合,其中的文档如下所示:

 
  _id: "384iojweiu83ur8233uui",
  name: "Jack",
  friends: [
     
      _id: "384798237498234",
      name: "Alfred"
    ,
     
      _id: "384798234749829",
      name: "Deborah"
    
  ]

我想检索一个给定_id 的人,并且只有一个给朋友_id 的朋友。像这样的:

 
  _id: "384iojweiu83ur8233uui",
  name: "Jack",
  friend_id: "384798237498234",
  friend_name: "Alfred"  

我试图通过 c# mongo 驱动程序中的unwind 方法这样做,但是我被困在这一点上。

var people = await collection.Aggregate()
    .Unwind<Person, PersonWithFriend>(_ => _.friends  )
    .Match( _ => _.Id == new ObjectId("5b646004b5728100042dd358"))
    .ToListAsync(); 

【问题讨论】:

【参考方案1】:

您可以使用positional operator $ 仅返回数组的第一个匹配元素:

db.users.find(
     "friends._id": "384798237498234" ,
     "name": 1, "friends.$": 1 
);

或者,如果您需要在friends 子文档上匹配多个条件,您可以使用$elemMatch

db.users.find(
     "friends":   
        "$elemMatch":  "id": "384798237498234",  "somethingElse": "..." 
    ,
     "name": 1, "friends.$": 1 
);

这将生成带有单个元素的friends 数组的结果:

 
    _id: "384iojweiu83ur8233uui",
    name: "Jack",
    friends: [
        id: "384798237498234",
        name: "Alfred"  
    ]

如果您确实需要在结果对象的根目录中包含朋友的idname,那么您可以使用聚合框架做同样的事情并在最后添加一个展开步骤。

在 C# 中应该是这样的:

users
    .Find(user => user.friends.Any(friend => friend.id == "384798237498234"))
    .Project(projection)
    .ToListAsync();

【讨论】:

对不起@Danziger 我在问如何在 C# MongoDB Driver Pipeline 中做到这一点,而不是纯 mongodb js。不过谢谢。我将尝试使用 Bson 文档查询方法。

以上是关于展开时字段名称冲突 (_id)的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis学习总结_04_解决字段名与实体类属性名不相同的冲突

MyBatis学习总结——解决字段名与实体类属性名不相同的冲突

Mybatis解决字段名与实体类属性名不相同的冲突

MyBatis学习总结——解决字段名与实体类属性名不相同的冲突(转载)

MyBatis——解决字段名与实体类属性名不相同的冲突

解决字段名与实体类属性名冲突